注册 登录
编程论坛 VFP论坛

【分享】VFP9增强命令TRIM、ALLTRIM、RIGHT

kangss 发布于 2025-10-20 17:34, 318 次点击
去数值尾部的0,如果数值字段多记录多,转json很有用
? ALLTRIM("12.0", "0",".")
? RTRIM("12.100", "0")
? TRIM(TRANSFORM(-012.00), "0")

2万记录5字段测试:TRIM(TRANSFORM(-012.00), "0")
自定义函数 0.328 秒
TRIM命令   0.064 秒
速度大约提高 5 倍

12 回复
#2
csyx2025-10-20 18:54
以下是引用kangss在2025-10-20 17:34:36的发言:
? ALLTRIM("12.0", "0",".")

有这么用的吗?1200 全变 12 了
? ALLTRIM("1200.00", "0",".")
? ALLTRIM("1200", "0",".")
#3
kangss2025-10-21 13:07
以下是引用csyx在2025-10-20 18:54:29的发言:
有这么用的吗?1200 全变 12 了
? ALLTRIM("1200.00", "0",".")
? ALLTRIM("1200", "0",".")

这么用确实有BUG

这样可以:
a = "1200"
b = "1200.00"

? LTRIM(RTRIM(RTRIM(STR(VAL(a),20,4), '0'), '.'))
? LTRIM(RTRIM(RTRIM(STR(VAL(b),20,4), '0'), '.'))


[此贴子已经被作者于2025-10-21 18:58编辑过]

#4
kangss2025-10-21 19:24
主要原因是不能用“TRANSFORM”,必须要保留小数点“定位”
#5
吹水佬2025-10-21 20:04
?TRIM(ALLTRIM(TRANSFORM(1200.00,"99999999.99"),"0"," "),".")
?TRIM(ALLTRIM(TRANSFORM(1200,"99999999.99"),"0"," "),".")
#6
kangss2025-10-22 10:46
字符型数值、数值型数值,这样就完美了


[此贴子已经被作者于2025-10-22 10:48编辑过]

#7
csyx2025-10-22 10:59
以下是引用kangss在2025-10-22 10:46:44的发言:

字符型数值、数值型数值,这样就完美了

完美吗?试试
?TRIM(ALLTRIM(TRANSFORM(0,"99999999.99"),"0"," "),".")
#8
cssnet2025-10-22 11:30
印象中,我以前不得不写的函数是:

LTrim0x00()
RTrim0x00()
AllTrim0x00()

用来Trim()干净那些C返回的以0x00结尾的字符串。
事关,C对待字符串很随意,直接加一个0x00,就粗暴截断,根本不会管后边有无垃圾字符。
"Hello World!" + 0h00 + "巴拉巴拉……"
VFP是无法直接Trim()干净的。


[此贴子已经被作者于2025-10-22 11:31编辑过]

#9
kangss2025-10-22 11:50
以下是引用csyx在2025-10-22 10:59:19的发言:
完美吗?试试
?TRIM(ALLTRIM(TRANSFORM(0,"99999999.99"),"0"," "),".")

你这个测试的非常好

a = "0"
b = "1200"
c = "1200.00"

? LTRIM(RTRIM(RTRIM(STR(VAL(a),20,4), '0'), '.'))
? LTRIM(RTRIM(RTRIM(STR(VAL(b),20,4), '0'), '.'))
? LTRIM(RTRIM(RTRIM(STR(VAL(c),20,4), '0'), '.'))

去掉尾部的0主要用于字符型显示,转成json字符串:还是要保留小数点定位
1、dbf中的数值字段,去掉尾部0转成字符型,用:LTRIM(RTRIM(RTRIM(STR(jinjia,20,4), '0'), '.'))
2、字符型字段或字符串:去掉尾部0转成字符型,用:LTRIM(RTRIM(RTRIM(STR(VAL(a),20,4), '0'), '.'))

#10
吹水佬2025-10-22 11:52
以下是引用csyx在2025-10-22 10:59:19的发言:


完美吗?试试
?TRIM(ALLTRIM(TRANSFORM(0,"99999999.99"),"0"," "),".")

用这种方法只能只抽
? TRIM(TRIM(LTRIM(TRANSFORM(0,"99999999.99")," "),"0"),".")
#11
kangss2025-10-22 12:03
以下是引用吹水佬在2025-10-22 11:52:06的发言:


用这种方法只能只抽
? TRIM(TRIM(LTRIM(TRANSFORM(0,"99999999.99")," "),"0"),".")

只有本站会员才能查看附件,请 登录

测试正确,这个比“STR”更简洁

用笨办法合并一起测试:
? LTRIM(RTRIM(RTRIM(STR(IIF(TYPE("jinjia") = "C", VAL(jinjia), jinjia),20,4), '0'), '.'))
只有本站会员才能查看附件,请 登录


#12
csyx2025-10-22 12:24
不建议直接硬编码,可能存在很多你未预料的数据,用自定义函数更利于后续扩展和维护,如果输入源是第三方提供的,更需如此
例如:同样是 numeric 型数值,一旦别人给你的 json 串采用了科学计数法,你这样一转换就纯属画蛇添足
以现今电脑的能力和人力成本比较,这点时间和空间上的花销是值得的

[此贴子已经被作者于2025-10-22 12:26编辑过]

#13
吹水佬2025-10-22 15:49
如果是 xxx...xx.xx 格式的串,分开整数与小数,只处理小数部分就可以。
分开整数与小数可以利用截取文件名函数。

1