如何在Word RTF中处理Oracle金额字符串拆分(兼容无小数场景)
问题描述
从Oracle数据库的iby_trxn_documents表提取数据时,发票金额字段Value为字符串类型,示例值包括"54380"、"19.80"。需要将该字符串转换为"XX Dollars and XX Cents"格式,例如:
"54380"→"54380 Dollars and 0 Cents""19.80"→"19 Dollars and 80 Cents"
使用Microsoft Word的RTF模板处理时,尝试过以下表达式均未达到预期效果:
<?xdoxslt: truncate(PaymentAmount/Value * 1)?> <?xdofx:floor(format-number:PaymentAmount/Value;’99G999G999’?> <?format-number:PaymentAmount/Value;’######’?> <?truncate(format-number:PaymentAmount/Value;’999G999D99’)?> <?round(format-number:PaymentAmount/Value;’999G999D99’)?> <?format-number(round(100 * $number) div 100, '#.00')?>
此前使用的表达式<?xdofx:substr(PaymentAmount/Value,1,Instr(PaymentAmount/Value,'.',-1)-1)?>仅在金额包含小数点时有效,无小数点场景下会失效,现需兼容两种场景的拆分逻辑。
解决方案
方案一:统一格式后拆分
先将字符串金额转为标准两位小数格式,再拆分整数(美元)和小数(分)部分,兼容两种场景:
提取美元部分
<?xdoxslt:replace(xdoxslt:format-number(PaymentAmount/Value * 1, '0.00'), '\.\d{2}', '')?>
PaymentAmount/Value * 1:将字符串转为数值类型xdoxslt:format-number(..., '0.00'):强制格式化为两位小数,无小数的金额自动补.00(如54380→54380.00)xdoxslt:replace(..., '\.\d{2}', ''):移除小数点及后两位,得到纯整数部分
提取分部分
<?xdoxslt:substring(xdoxslt:format-number(PaymentAmount/Value * 1, '0.00'), string-length(xdoxslt:format-number(PaymentAmount/Value * 1, '0.00')) - 1)?>
- 先统一转为两位小数格式,再截取最后两位作为分的数值
完整组合
<?xdoxslt:replace(xdoxslt:format-number(PaymentAmount/Value * 1, '0.00'), '\.\d{2}', '')?> Dollars and <?xdoxslt:substring(xdoxslt:format-number(PaymentAmount/Value * 1, '0.00'), string-length(xdoxslt:format-number(PaymentAmount/Value * 1, '0.00')) - 1)?> Cents
方案二:用NVL处理空值场景
利用xdofx的nvl函数,直接处理小数点不存在的情况,逻辑更简洁:
提取美元部分
<?xdofx:nvl(substr(PaymentAmount/Value,1,instr(PaymentAmount/Value,'.',-1)-1), PaymentAmount/Value)?>
- 当
instr找不到小数点返回0时,substr会得到空值,此时nvl返回原金额字符串作为整数部分
提取分部分
<?xdofx:nvl(substr(PaymentAmount/Value,instr(PaymentAmount/Value,'.',-1)+1), '00')?>
- 当找不到小数点时,
substr返回空值,nvl返回00作为分的数值
完整组合
<?xdofx:nvl(substr(PaymentAmount/Value,1,instr(PaymentAmount/Value,'.',-1)-1), PaymentAmount/Value)?> Dollars and <?xdofx:nvl(substr(PaymentAmount/Value,instr(PaymentAmount/Value,'.',-1)+1), '00')?> Cents
内容的提问来源于stack exchange,提问作者JamesC
相关产品推荐
相关产品推荐

