主题:[求助]如何既保留小数位数又能截取固定字符长度?
tian_2008
[专家分:0] 发布于 2010-07-20 10:22:00
小女子还要大侠们帮帮忙了,多谢多谢啦,呵呵。
有一个dbf表,下有三列,A为数值型的,B、C均为字符型的,
其中A列的小数位数均为3位,小于等于9999.999。
A B C
12.123 ML
125.100 MG
1320.020 L
101.000 G
3.005 MG
1.500 G
4.000 ML
15.000 UG
0.050 ML
0.125 G
0.100 G
0.901 MG
..... ....
以下省略
呵呵,菜鸟俺的表述能力实在是太差了,再描述一遍,呵呵。
现在想将C列用‘A+ ' '+B’替换,但是需要达到如下结果,即
截取A列的从左数四个字符([color=FF0000]数字不四舍五入[/color],截止到多少算多少),
[color=FF0000]对于 >=100&<=9999.999 的数值,取其整数;
对于 >=10&<=99.999 的数值,取从左至右四个字符;
注意:
对于实际小数点位数为0的数值,直接取整数,如15.000、39.000、89.000等,直接取其整数15、39、89。
对于 >=1&<=9.999 的数值,取从左至右四个字符;
注意:
对于实际小数点位数为0位的数值,直接取整数,如1.000、3.000、8.000等,直接取其整数1、3、8。
对于实际小数点位数为1位的数值,直接取到小数点后一位,如3.500、7.900、9.300等,直接取到小数点后一位,即3.5、7.9、9.3。
对于 >=0.001&<=0.999 的数值,取从左至右四个字符;
注意:
对于实际小数位数为1位的,如0.600、0.900、0.800等,直接取到小数点后一位,即0.6、0.9、0.8.[/color]
C列想要达到的替换结果如下
12.1 ML
125 MG
1320 L
101 G
3.00 MG
1.5 G
4 ML
15 UG
0.05 ML
0.12 G
0.1 G
0.90 MG
如果单纯用命令
replace all C with left(allt(str(A,8,3)),4)+' '+allt(B)
达不到我想要的结果。
请各位大侠帮帮忙啊,多谢多谢。
在线等,请大家伸出援手啊,呵呵。
最后更新于:2010-07-21 10:48:00
回复列表 (共17个回复)
沙发
北京惬意 [专家分:1330] 发布于 2010-07-20 14:26:00
没看懂题意,应该不难。
板凳
qjbzjp [专家分:8830] 发布于 2010-07-20 16:20:00
replace all C with IIF(INT(a)=a,ALLTRIM(STR(INT(a))),left(ALLTRIM(STR(a,6,1)),4))+' '+allt(B)
3 楼
sywzs [专家分:5650] 发布于 2010-07-20 17:05:00
12.1 ML
125 MG
1320 L
101 G
3.00 MG
1.5 G
4 ML
15 UG
以上数据我没有弄明白的是:
1.500 、 4.000 、15.000
都把右边的"0"及相应的小数点去掉了,而唯独3.00却保留了右边的"0"
请搂主提供保留的依据,以便在语句中加以判断。
4 楼
tian_2008 [专家分:0] 发布于 2010-07-20 17:05:00
sorry, sorry。
忘记了还有一种情况,就是有0.025、0.501、0.310这样的小数的话,保留从左开始四个字符,即结果是0.02、0.50、0.31。
qjbzjp大侠,您再给看看。多谢多谢
5 楼
tian_2008 [专家分:0] 发布于 2010-07-20 17:14:00
to sywzs
3.005,因为是截取了从左数四个字符,所以正好取到了3.00,这样是方便我们将来核查数据的时候,知道这个后面是还有小数位数的。
如果也将它取成3整数的话,将来查的时候就以为它就是3呢。
所以比较麻烦一点,还请大侠帮忙。多谢多谢,:)
6 楼
sywzs [专家分:5650] 发布于 2010-07-20 17:14:00
把2楼的稍微改一下
replace all C with IIF(INT(a)=a,ALLTRIM(STR(INT(a))),left(LTRIM(STR(a,8,3)),4))
7 楼
tian_2008 [专家分:0] 发布于 2010-07-20 17:28:00
这样好像不行,
取出来的结果是这样的
12.1 ML
[color=FF0000]125.MG[/color]
1320 L
101 G
3.00 MG
[color=FF0000]1.50 G[/color]
4 ML
15 UG
0.05 ML
0.12 G
[color=FF0000]0.10 G[/color]
红字标注的地方不太对:
125后面带着小数点,
1.50G,应该是1.5G才对。
0.10G,应该是0.1G才对。
请大侠再给看看,多谢多谢。
8 楼
sywzs [专家分:5650] 发布于 2010-07-20 17:35:00
replace all C with IIF(INT(a)=a or a>=100,ALLTRIM(STR(INT(a))),left(LTRIM(STR(a,8,3)),4))))+' '+allt(B)
加了一个 or
9 楼
tian_2008 [专家分:0] 发布于 2010-07-20 17:51:00
呵呵,
125后面带小数点的问题解决了。
但是这个1.50G,应该是1.5G;0.10G,应该是0.1G。还是没有解决呢。
大侠,您再看看呗,谢谢。
10 楼
sywzs [专家分:5650] 发布于 2010-07-20 19:47:00
再改一下
replace all C with IIF(INT(a)=a or a>=100,ALLTRIM(STR(INT(a))),left(LTRIM(RTRIM(STR(a,8,3),"0")),4))))))+' '+allt(B)
我来回复