请问如何取得以下字符窜中的数字(30分)

  • 主题发起人 主题发起人 T915218
  • 开始时间 开始时间
T

T915218

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何取得以下字符窜中的数字(在此字符窜中汉字是固定的,数字是每天在变化的)
str="2004年03月02日产油104462.5吨,产气1425.96万米3,原油销售98761吨,天然气销售1033.11万米3,原油库存273600.03吨。"
 
var
str,tmp:String;
i:integer;
strlist:TStringList;
begin
str:='2004年03月02日产油104462.5吨,产气1425.96万米3,原油销售98761吨,天然气销售1033.11万米3,原油库存273600.03吨。 ';
strList:=TStringList.Create;
tmp:='';
for i:=1 to length(str)do
begin
if ((str>='0') and (str<='9')) or (str='.') then
tmp:= tmp+str
else
tmp:= tmp+' ';
end;
strList.CommaText:=tmp;
for i:=0 to strlist.Count-1do
showmessage(strlist);
end;
 
要把取得的2004 03 02 104462.5 1425.96 98761 1033.11 273600.03
这些数值附给不同的变量,好象不行.请用java 语言写好吗?
 
2楼方法就可以了呀。
 
String str="2004年03月02日产油104462.5吨,产气1425.96万米3,原油销售98761吨,天然气销售1033.11万米3,原油库存273600.03吨。";
String a[] = new String[10];
int i,j=0;
boolean tag=false;
for(i=0;i<10;i++) a="";
for(i=0;i<str.length();i++) {
if(str.charAt(i)>='0' &amp;&amp;
str.charAt(i) <='9' || str.charAt(i) =='.') {
a[j] = a[j] + str.charAt(i);
tag = true;
}
else
{
if(tag) {
j++;
tag = false;
}
}
}
 
更好的方法是使用正则表达式,只要两句话就可以了
Pattern.compile
pattern.matcher
剩下的就是用matcher.group取你想要的任何一段数据了,代码如下:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
// 构建匹配模式
Pattern pattern = Pattern.compile("([0-9]{4})年([0-9]{1,2})月([0-9]{1,2})日产油([0-9]{1,}.[0-9]{1,})吨,产气([0-9]{1,}.[0-9]{1,})万米3,原油销售([0-9]{1,})吨,天然气销售([0-9]{1,}.[0-9]{1,})万米3,原油库存([0-9]{1,}.[0-9]{1,})吨");
// 匹配你的数据
Matcher matcher = pattern.matcher("2004年03月02日产油104462.5吨,产气1425.96万米3,原油销售98761吨,天然气销售1033.11万米3,原油库存273600.03吨");
if (matcher.matches()) {
// 输出
for (int i=1;
i<9;
i++) {
System.out.println(matcher.group(i));
}
} else
{
System.out.println("Invalid input");
}
}
}
// 输出结果如下:
2004
03
02
104462.5
1425.96
98761
1033.11
273600.03
// 你可以任意使用这些数据了[:D]
 
function GetNumFromStr(const str: String;const hex:boolean=false): String;
var
i:integer;
charset:Set of char;
begin
if hex then
charset:=['0'..'9','a'..'f','A'..'F','.']
else
charset:=['0'..'9','.'];
for i := 1 to Length(str)do
begin
if (str in charset) then
result:= result + uppercase(str);
end;
end;
 
首先拆分字符串,并用 ord(ss)方式判断码 in [46,48..57] 的格式是最有效的
var ss,sz_str:String ;
i:smallint ;
str:string ;
begin

str:='你的字符';
for i:=1 to length(str)do

begin

if ord(ss) in [48..57] then
sz_str:=sz_str + ss
else
sz_str:=sz_str + ' ' ;
//注意是一个空格
end ;
sz_str 为结果
 
<----程序的改进,应该可以用了------->
var ss,sz_str:String ;
i,j:smallint ;
strList:TStringList;
begin
ss:='2004年03月02日产油104462.5吨,产气1425.96万米3,原油销售98761吨,天然气销售1033.11万米3,原油库存273600.03吨。 ';
try
strList:=TStringList.Create;
for i:=1 to length(ss)do
begin
if ord(ss) in [46,48..57] then
sz_str:=sz_str + ss
else
sz_str:=sz_str + ' ' ;
//注意是一个空格
end;

strList.CommaText:=sz_str;
for j:=0 to strList.Count-1do
showmessage(strList[j]);
finally
strList.Free;
end;
 
还是正则表达式方便,
不过不同语言中不太相同,还得学习...
 
呵呵,vinep兄,其实大同小异了,我也是用java没多久,你看看php的代码,很简单,跟java其实也差不多呀:
<?php
$data="2004年03月02日产油104462.5吨,产气1425.96万米3,原油销售98761吨,天然气销售1033.11万米3,原油库存273600.03吨";
if (ereg ("([0-9]{4})年([0-9]{1,2})月([0-9]{1,2})日产油([0-9]{1,}/.[0-9]{1,})吨,产气([0-9]{1,}/.[0-9]{1,})万米3,原油销售([0-9]{1,})吨,天然气销售([0-9]{1,}/.[0-9]{1,})万米3,原油库存([0-9]{1,}/.[0-9]{1,})吨", $data, $regs)) {
foreach($regs as $key=>$val) {
echo($val."<br>");
}
} else
{
echo "Invalid date format: $data";
}
?>
 
使用pos和copy函数
var
s : Integer;
str : string;
strValue : AnsiString;
begin
str="2004年03月02日产油104462.5吨,产气1425.96万米3,原油销售98761吨,天然气销售1033.11万米3,原油库存273600.03吨。"
s := Pos(str, '年');
strValue := copy(str, s - 4, 4);
其它的以此类推
 
谢谢各位的热心帮助!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部