首页 > 解决方案 > 在 Crystal Reports 中将字符串数字转换为十进制时出错:“字符串是非数字的”

问题描述

问题描述

在我的报告中,我得到了字符串中的金额。格式很不寻常:

  1. "" - 零金额
  2. "(200.00)" - 是负数
  3. “1,234.56” - 是正数

我想以更方便的方式将这些字符串转换为数值:

  1. 0.00
  2. -200.00
  3. 1234.56

首先,我正在对字符串数量进行一些预格式化:

local stringvar amount := Trim({PLD__ITEMS.F_18});

if amount = ''
    then amount := '0.00'
;

amount := Replace(amount, "(", "-");
amount := Replace(amount, ")", "");
amount := Replace(amount, ",", "");
amount := Replace(amount, " ", "");

然后我想使用ToNumberCDbl方法将字符串转换为数字,但都产生相同的错误

// "The string is non-numeric"
//ToNumber(amount)

// "The string is non-numeric"
//CDbl(amount)

我不知道什么可能导致这个错误。
我在格式化的金额中找不到任何损坏的字符串...

字符串是非数字的


问题

  1. 如何修复我的字符串数量以使ToNumberCDbl 正常工作?
  2. 如何在不使用ToNumberCDbl方法的情况下将字符串数量转换为十进制数?

如果只有显示问题,我可以使用字符串,但我需要对这些数量进行一些计算,所以我必须在那里使用数值。


测试字符串数量中的意外字符

我准备了具体的测试,看看是否有任何字符串量值里面有意外字符,但下面比较的所有结果都返回了True

// ---- test ----

amount := Replace(amount, "0", "");
amount := Replace(amount, "1", "");
amount := Replace(amount, "2", "");
amount := Replace(amount, "3", "");
amount := Replace(amount, "4", "");
amount := Replace(amount, "5", "");
amount := Replace(amount, "6", "");
amount := Replace(amount, "7", "");
amount := Replace(amount, "8", "");
amount := Replace(amount, "9", "");
amount := Replace(amount, ".", "");
amount := Replace(amount, "-", "");

// has not unexpected characters
amount = ''

// ---- end test ----

测试转换

我测试了以点为小数点分隔符的字符串的显式转换,再次发生错误(这对我来说很奇怪)!

在此处输入图像描述


我正在使用水晶报表 2013

标签: crystal-reportscrystal-reports-2013

解决方案


我解决这个问题的想法是将字符串数量拆分为整数和小数部分,分别将它们转换为数字,然后将两者相加以获得值。

local stringvar amount := Trim({PLD__ITEMS.F_18});
local stringvar intAmount := '0';
local stringvar decAmount := '0';
local numbervar result;
local numbervar decimal;


if amount = ''
    then amount := '0.00'
;

amount := Replace(amount, "(", "-");
amount := Replace(amount, ")", "");
amount := Replace(amount, ",", "");
amount := Replace(amount, " ", "");

if InStr(amount, '.') > 0
    then (
        intAmount := Left(amount, InStr(amount, '.') - 1);
        decAmount := Right(amount, len(amount) - InStr(amount, '.'));
    )
    else intAmount := amount
;

result := ToNumber(intAmount);
decimal := ToNumber(decAmount) / 100;

if result > 0
    then result := result + decimal
    else result := result - decimal
;

尽管这个棘手的解决方案效果很好,但我的问题仍然是开放的想法和/或建议。

更新

修复负数的解决方案 - 小数部分应从整数部分中减去


推荐阅读