crystal-reports - 在 Crystal Reports 中将字符串数字转换为十进制时出错:“字符串是非数字的”
问题描述
问题描述
在我的报告中,我得到了字符串中的金额。格式很不寻常:
- "" - 零金额
- "(200.00)" - 是负数
- “1,234.56” - 是正数
我想以更方便的方式将这些字符串转换为数值:
- 0.00
- -200.00
- 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, " ", "");
然后我想使用ToNumber或CDbl方法将字符串转换为数字,但都产生相同的错误
// "The string is non-numeric"
//ToNumber(amount)
// "The string is non-numeric"
//CDbl(amount)
我不知道什么可能导致这个错误。
我在格式化的金额中找不到任何损坏的字符串...
问题
- 如何修复我的字符串数量以使ToNumber和CDbl 正常工作?
- 如何在不使用ToNumber或CDbl方法的情况下将字符串数量转换为十进制数?
如果只有显示问题,我可以使用字符串,但我需要对这些数量进行一些计算,所以我必须在那里使用数值。
测试字符串数量中的意外字符
我准备了具体的测试,看看是否有任何字符串量值里面有意外字符,但下面比较的所有结果都返回了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
解决方案
我解决这个问题的想法是将字符串数量拆分为整数和小数部分,分别将它们转换为数字,然后将两者相加以获得值。
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
;
尽管这个棘手的解决方案效果很好,但我的问题仍然是开放的想法和/或建议。
更新
修复负数的解决方案 - 小数部分应从整数部分中减去
推荐阅读
- java - Drools:为多个请求重用相同的 Kiesession
- r - 如何消除另一个数据框中基于列名的数据框中的行
- c - 线的最大长度
- prolog - 如何在 Prolog 代码本身中编写“findall”?
- javascript - 根据子对象数组的字段对对象数组进行排序
- python - 为什么在这个对 iter 的调用中哨兵是强制性的?
- reactjs - Props 对象从 React 官方文档中传子给组件是什么意思
- reactjs - 我不能用钩子。我不能用对象设置用户。我应该怎么办?
- java - 带有内部枚举类的 Eclipse AST 的奇怪结果
- java - 如果绑定到 Container-Height,ScrollPane 不会立即调整 ViewPort-Height 的大小