主题:提取数字
zhengxinhai
[专家分:30] 发布于 2008-09-14 06:55:00
象"456中华人民共和国123"类型的字符,均是汉字后有数字,
请问各位老师怎样提取汉字后面的数字呢?
回复列表 (共17个回复)
11 楼
cbl518 [专家分:57140] 发布于 2008-09-14 21:36:00
?SUBSTR(c1,RAT(GETWORDNUM(c1,GETWORDCOUNT( c1,"0987654321"),"0987654321"),c1)+LEN(GETWORDNUM(c1,GETWORDCOUNT( c1,"0987654321"),"0987654321")))
12 楼
wuzhouhong [专家分:10890] 发布于 2008-09-14 21:54:00
?xyz("456中华人民共和国123") && 123
**** xyz.prg
PARAMETERS cString
LOCAL I,cResult
m.cResult=""
FOR m.I=1 TO LEN(m.cString)
IF !ISDIGIT(RIGHT(m.cString,m.I))
m.cResult=RIGHT(m.cString,m.I-1)
EXIT
ENDIF
ENDFOR
RETURN m.cResult
13 楼
zhengxinhai [专家分:30] 发布于 2008-09-15 15:47:00
4楼的考师,你的代码?CHRTRAN(T1,transform(VAL(t1))+CHRTRAN(T1,"0123456789",""),"")
好像有点问题,请您试试如下:
t1="45sssss存在了456"
?CHRTRAN(T1,transform(VAL(t1))+CHRTRAN(T1,"0123456789",""),"")为6,因为t1前面数字含有后面数字中的字符。
以上有该问题的句子有几个
14 楼
homayzh [专家分:7040] 发布于 2008-09-15 17:50:00
我也是自定函数,比12楼老师的简单一点吧!
LPARAMETERS cValue
cc = ''
FOR n = 1 TO LEN(cValue)
cc = cc + IIF(BETWEEN(SUBSTR(cValue,n,1),"0","9"),SUBSTR(cValue,n,1),'')
ENDFOR
RETURN cc
15 楼
qjbzjp [专家分:8830] 发布于 2008-09-15 19:14:00
[quote]4楼的考师,你的代码?CHRTRAN(T1,transform(VAL(t1))+CHRTRAN(T1,"0123456789",""),"")
好像有点问题,请您试试如下:
t1="45sssss存在了456"
?CHRTRAN(T1,transform(VAL(t1))+CHRTRAN(T1,"0123456789",""),"")为6,因为t1前面数字含有后面数字中的字符。
以上有该问题的句子有几个
[/quote]
按我在6楼的回复代码就不会有问题了:
我的思路是:
1。将所有数字换成空格;
2。切掉尾部的空格;
3。用原来的字符串长度减去切掉尾部空格后的字符串长度,就知道最后的数字长度了;
4。在原串取出这个数字长度。
这样不论字符串中间的数字、汉字、空格等如何变化都不会有问题。只是如果最后的数字前后是空格还会一起取出来,如果是这样,给整句代码再多加上alltrim()就万无一失了。
16 楼
wuzhouhong [专家分:10890] 发布于 2008-09-16 09:59:00
[quote]我也是自定函数,比12楼老师的简单一点吧!
LPARAMETERS cValue
cc = ''
FOR n = 1 TO LEN(cValue)
cc = cc + IIF(BETWEEN(SUBSTR(cValue,n,1),"0","9"),SUBSTR(cValue,n,1),'')
ENDFOR
RETURN cc[/quote]
您的程序存在一点点小的问题,
虽然行数减少了,但是它会循环完整个字符串长度,因此如果这个字符串很长的话,大量的计算时间就会消耗在不必要的循环上。
17 楼
martine [专家分:4950] 发布于 2008-09-16 13:32:00
A=串长
b="0123456789"
c=""
for i=1 to a
d=subs(串,i,1)
if d$b=.t.
c=c+d
endif
endfor
我来回复