回 帖 发 新 帖 刷新版面

主题:[求助]如何既保留小数位数又能截取固定字符长度?

小女子还要大侠们帮帮忙了,多谢多谢啦,呵呵。

有一个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)
达不到我想要的结果。

请各位大侠帮帮忙啊,多谢多谢。
在线等,请大家伸出援手啊,呵呵。





回复列表 (共17个回复)

沙发

没看懂题意,应该不难。

板凳

replace all C with IIF(INT(a)=a,ALLTRIM(STR(INT(a))),left(ALLTRIM(STR(a,6,1)),4))+' '+allt(B)

3 楼

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 楼

sorry, sorry。
忘记了还有一种情况,就是有0.025、0.501、0.310这样的小数的话,保留从左开始四个字符,即结果是0.02、0.50、0.31。

qjbzjp大侠,您再给看看。多谢多谢

5 楼


 to sywzs

  3.005,因为是截取了从左数四个字符,所以正好取到了3.00,这样是方便我们将来核查数据的时候,知道这个后面是还有小数位数的。
  如果也将它取成3整数的话,将来查的时候就以为它就是3呢。
  所以比较麻烦一点,还请大侠帮忙。多谢多谢,:)

6 楼

把2楼的稍微改一下
replace all C with IIF(INT(a)=a,ALLTRIM(STR(INT(a))),left(LTRIM(STR(a,8,3)),4))

7 楼

这样好像不行,

取出来的结果是这样的
      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 楼

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 楼

呵呵,
  125后面带小数点的问题解决了。

但是这个1.50G,应该是1.5G;0.10G,应该是0.1G。还是没有解决呢。

大侠,您再看看呗,谢谢。

10 楼

再改一下
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)

我来回复

您尚未登录,请登录后再回复。点此登录或注册