注册 登录
编程论坛 VFP论坛

如何从“购物清单”字段中统计每天购物共用了多少元

王咸美 发布于 3 天前 18:57, 504 次点击
现有表文件gem xx.dbf,如何从“购物清单”字段中统计每天购物共用了多少元,并写入统计字段中。请高手赐教,万分感谢!!!

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

只有本站会员才能查看附件,请 登录
34 回复
#2
kangss3 天前 19:20
思路:
1、先找“元”出现的次数
2、根据“元”,往左循环截取 1 字符,不是数字,就停止,此时应该能取出金额数字

#3
sam_jiang3 天前 19:55
你这表格设计的比小学生好一点

这样设计表格是灾难性的,一旦用户输入错误的数字,根本无法查找出错原因~

[此贴子已经被作者于2025-10-16 08:27编辑过]

#4
王咸美3 天前 20:06
更正:从“购物明细”字段中统计每天购物用了多少元,并写入“合计”字段中
#5
nbwww3 天前 20:32
正则
#6
nbwww3 天前 20:42
Clear
?RegExpTest("([.0-9_-])+(元)","黄鳝40元牛肉61元鸡蛋11元冷菜75元蔬菜53元肉10.30元")
      
Function RegExpTest(patrn, strng)
regEx = CreateObject("VBScript.RegExp")   &&建立正则表达式对象
regEx.Pattern = patrn                      &&设置模式
regEx.IgnoreCase = .T.                     &&设置是否区分字符大小写
regEx.Global = .T.                         &&设置全局可用性
Matches = regEx.Execute(strng)            &&执行搜索
RetStr=0
For Each Match in Matches               &&遍历匹配集合
  RetStr=RetStr+VAL(Match.Value)
Next
Return RetStr

[此贴子已经被作者于2025-10-15 20:46编辑过]

#7
nbwww3 天前 20:50
CLOSE DATABASES ALL
SELECT 0
USE gwmxz
REPLACE ALL 合计 WITH RegExpTest("([.0-9_-])+(元)",购物明细)
      
Function RegExpTest(patrn, strng)
regEx = CreateObject("VBScript.RegExp")   &&建立正则表达式对象
regEx.Pattern = patrn                      &&设置模式
regEx.IgnoreCase = .T.                     &&设置是否区分字符大小写
regEx.Global = .T.                         &&设置全局可用性
Matches = regEx.Execute(strng)            &&执行搜索
RetStr=0
For Each Match in Matches               &&遍历匹配集合
  RetStr=RetStr+VAL(Match.Value)
Next
Return RetStr
#8
王咸美3 天前 22:50
谢谢!
#9
吹水佬前天 00:17
只有本站会员才能查看附件,请 登录

程序代码:

DECLARE long sscanf IN msvcr71 long, string, single@, long@
DECLARE long strcpy IN msvcr71 string@, string
购物明细 = "黄鳝40元牛肉61元鸡蛋11元冷菜75元蔬菜53元肉10.30元"
buffer = REPLICATE(0h00,256)
p = strcpy(@buffer, 购物明细)
a = 0.00
n = 0
t = 0
DO WHILE SYS(2600,p,1) != 0h00
    IF sscanf(p,"%f%n",@a,@n) == 1
        ? a
        t = t+a
        p = p+n
    ELSE
        p = p+1
    ENDIF
ENDDO
? t
#10
王咸美前天 00:55
@吹水佬 谢谢!如何将gwmxz.dbf中“购物明细”统计结果写入“合计”字段中,还请加以指导!谢谢!

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

#11
schtg前天 05:17
@nbwww,吹水版主,学习啦!正则确实非常好,谢谢!
只有本站会员才能查看附件,请 登录

又新加一些数字,结果确实正则好用!
只有本站会员才能查看附件,请 登录





[此贴子已经被作者于2025-10-16 05:25编辑过]

#12
吹水佬前天 06:21
以下是引用schtg在2025-10-16 05:17:05的发言:

@nbwww,吹水版主,学习啦!正则确实非常好,谢谢!

又新加一些数字,结果确实正则好用!

如果有些没有“元〞
如10元写成10;12.34元写成12.34

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

#13
吹水佬前天 06:27
数据无规无格,什么算法都不好使。
程序就是 数据结构+算法,有好的数据结构才有好的算法。
#14
王咸美前天 06:57
各位高手,请分享一下具体代码!谢谢!
#15
schtg前天 07:31
回复 12楼 吹水佬
这个绝对正确,表中的数据没有按照规矩记录,计算起来难度确实很大
#16
schtg前天 07:31
回复 13楼 吹水佬
#17
schtg前天 07:55
回复 14楼 王咸美
代码就在7楼
#18
吹水佬前天 07:57
如果只算元单位的数加多个判断就可以;如果要算不同单位的数就按单位结构检索判断。
程序代码:

DECLARE long sscanf IN msvcr71 long, string, single@, long@
DECLARE long strcpy IN msvcr71 string@, string
购物明细 = "黄鳝10条40元牛肉61元鸡蛋11元冷菜75元蔬菜53元肉10.30元"
buffer = REPLICATE(0h00,256)
p = strcpy(@buffer, 购物明细)
a = 0.00
n = 0
t = 0
DO WHILE SYS(2600,p,1) != 0h00
    IF sscanf(p,"%f%n",@a,@n) == 1
        p = p+n
        IF SYS(2600,p,2)=="元"
            ? a
            t = t+a
            p = p+2
        ENDIF
    ELSE
        p = p+1
    ENDIF
ENDDO
? t

#19
王咸美前天 08:06
@吹水佬 用上我提供的表文件gwmxz.dbf,上述代码如何修改?请指点!
另上述代码运行后显示结果为0,不知为何?
#20
吹水佬前天 08:13
回复 19楼 王咸美
只有本站会员才能查看附件,请 登录

程序代码:

DECLARE long sscanf IN msvcr71 long, string, single@, long@
DECLARE long strcpy IN msvcr71 string@, string
USE C:\_temp\gwmxz.dbf ALIAS td
buffer = REPLICATE(0h00,256)
REPLACE ALL 合计 WITH f_合计(购物明细) IN "td"
SELECT * FROM td

FUNCTION f_合计(c购物明细)
    p = strcpy(@buffer, 购物明细)
    a = 0.00
    n = 0
    t = 0
    DO WHILE SYS(2600,p,1) != 0h00
        IF sscanf(p,"%f%n",@a,@n) == 1
            p = p+n
            IF SYS(2600,p,2)=="元"
                t = t+a
                p = p+2
            ENDIF
        ELSE
            p = p+1
        ENDIF
    ENDDO
    RETURN t
ENDFUNC
#21
hsfisher前天 08:22
#22
王咸美前天 08:31
@吹水佬 刚才运行一下代码,不知为何“合计”中都显示“0.00”
#23
schtg前天 08:37
回复 20楼 吹水佬

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


[此贴子已经被作者于2025-10-16 08:38编辑过]

#24
吹水佬前天 08:46

比较了一下api算法与正则算差距还是有点明显

程序代码:

DECLARE long sscanf IN msvcr71 long, string, single@, long@
DECLARE long strcpy IN msvcr71 string@, string
buffer = REPLICATE(0h00,256)

USE C:\_temp\gwmxz.dbf ALIAS td
SELECT * FROM td INTO CURSOR tmp READWRITE
SELECT tmp
FOR i=1 TO 10000
    APPEND FROM DBF("td")
ENDFOR

#if 1    && 1 or 0
tm = SECONDS()
REPLACE ALL 合计 WITH f_合计(购物明细) IN "td"
? "api算法", SECONDS()-tm
#else
tm = SECONDS()
REPLACE ALL 合计 WITH RegExpTest("([.0-9_-])+(元)",购物明细) IN "td"
? "正则算法", SECONDS()-tm
#endif


*SELECT * FROM td

FUNCTION f_合计(c购物明细)
    p = strcpy(@buffer, 购物明细)
    a = 0.00
    n = 0
    t = 0
    DO WHILE SYS(2600,p,1) != 0h00
        IF sscanf(p,"%f%n",@a,@n) == 1
            p = p+n
            IF SYS(2600,p,2)=="元"
                t = t+a
                p = p+2
            ENDIF
        ELSE
            p = p+1
        ENDIF
    ENDDO
    RETURN t
ENDFUNC

      
Function RegExpTest(patrn, strng)
regEx = CreateObject("VBScript.RegExp")   &&建立正则表达式对象
regEx.Pattern = patrn                      &&设置模式
regEx.IgnoreCase = .T.                     &&设置是否区分字符大小写
regEx.Global = .T.                         &&设置全局可用性
Matches = regEx.Execute(strng)            &&执行搜索
RetStr=0
For Each Match in Matches               &&遍历匹配集合
  RetStr=RetStr+VAL(Match.Value)
Next
Return RetStr
#25
csyx前天 08:50
以下是引用吹水佬在2025-10-16 06:27:55的发言:

数据无规无格,什么算法都不好使。
程序就是 数据结构+算法,有好的数据结构才有好的算法。

这种无法无天的数据,加上人工智能好使
假设有:【草鸡单卖55元一只买8只共415元牛肉648元 - 问:总共花了多少钱】,交给能听懂人话的AI试试
#26
csyx前天 08:54

只有本站会员才能查看附件,请 登录
#27
schtg前天 15:13
回复 24楼 吹水佬
#28
王咸美前天 20:29
@吹水佬 谢谢您的热心指点!不知为何我在vfp9.0上运行程序,“合计”字段下均显示为0.00[合计 N(7,2)],未达到统计的效果。
#29
吹水佬前天 20:50
以下是引用王咸美在2025-10-16 20:29:09的发言:

@吹水佬 谢谢您的热心指点!不知为何我在vfp9.0上运行程序,“合计”字段下均显示为0.00[合计 N(7,2)],未达到统计的效果。

产生显示为0.00的代码呢?

#30
王咸美前天 22:26
就是没有实现统计汇总功能
#31
吹水佬昨天 00:14
以下是引用王咸美在2025-10-16 22:26:41的发言:

就是没有实现统计汇总功能

你不是说运行了程序结果是0.00吗?
我的意思就是想看看你运行的程序是什么。
#32
王咸美昨天 06:20
运行的程序为下列代码:
DECLARE long sscanf IN msvcr71 long, string, single@, long@
DECLARE long strcpy IN msvcr71 string@, string
USE C:\_temp\gwmxz.dbf ALIAS td
buffer = REPLICATE(0h00,256)
REPLACE ALL 合计 WITH f_合计(购物明细) IN "td"
SELECT * FROM td

FUNCTION f_合计(c购物明细)
    p = strcpy(@buffer, 购物明细)
    a = 0.00
    n = 0
    t = 0
    DO WHILE SYS(2600,p,1) != 0h00
        IF sscanf(p,"%f%n",@a,@n) == 1
            p = p+n
            IF SYS(2600,p,2)=="元"
                t = t+a
                p = p+2
            ENDIF
        ELSE
            p = p+1
        ENDIF
    ENDDO
    RETURN t
ENDFUNC
#33
schtg昨天 07:11
回复 32楼 王咸美
可以计算的,有结果哈
只有本站会员才能查看附件,请 登录



[此贴子已经被作者于2025-10-17 07:20编辑过]

#34
吹水佬昨天 07:21
回复 32楼 王咸美
“C:\_temp\gwmxz.dbf”这个你也用得着?
我出的代码通常只是作参考不能照抄,一定要先看懂思路,不明之处可以继续讨论。

#35
吹水佬昨天 07:26
更正一下
FUNCTION f_合计(c购物明细)
    p = strcpy(@buffer, 购物明细)
改为:
FUNCTION f_合计(c购物明细)
    p = strcpy(@buffer, c购物明细)

只针对这个数据表也可以:
FUNCTION f_合计(c购物明细)
    p = strcpy(@buffer, 购物明细)
改为:
FUNCTION f_合计()
    p = strcpy(@buffer, 购物明细)
调用:
REPLACE ALL 合计 WITH f_合计() IN "td"



[此贴子已经被作者于2025-10-17 07:29编辑过]

1