You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Bambora订单请求代码时出现无效字符串格式错误,寻求技术指导

解决Bambora订单请求中的「无效字符串格式」错误

看起来你的问题大概率出在金额字符串转换为整数的步骤上,咱们一步步来排查和修复:

问题根源分析

你当前的代码直接把金额字符串转成Int32,但忽略了几个关键问题:

  1. 丹麦克朗(DKK)的金额通常带有小数(比如199,95或者199.95),直接用Convert.ToInt32转换带小数点的字符串会触发格式错误。
  2. Bambora的amount字段要求的是最小货币单位的整数(比如199.95 DKK等于19995 øre),你直接转整数会丢失精度,同时格式转换也会失败。
  3. 如果Session("CardPaymentTotalPrice")里包含非数字字符(比如货币符号kr),也会导致转换失败。

修复后的代码

下面是更安全、符合Bambora要求的实现:

Dim orderRequest As BamboraOrderRequest = New BamboraOrderRequest
orderRequest.id = objCartData.GetOrderNumberWithoutInceasing()

' 1. 取出原始金额字符串并清理
Dim rawPrice As String = Session("CardPaymentTotalPrice").ToString().Trim()
' 如果字符串包含货币符号,先移除(比如"199,95 kr" → "199,95")
rawPrice = rawPrice.Replace("kr", "").Trim()

' 2. 标准化数字格式:丹麦地区用逗号作为小数点,替换为通用的小数点
Dim standardizedPrice As String = rawPrice.Replace(",", ".")

' 3. 安全解析为Decimal(避免精度丢失),再转换为最小货币单位的整数
Dim priceDecimal As Decimal
If Decimal.TryParse(standardizedPrice, Globalization.NumberStyles.Any, Globalization.CultureInfo.InvariantCulture, priceDecimal) Then
    ' 乘以100转换为øre(DKK的最小单位),四舍五入确保准确性
    orderRequest.amount = CInt(Math.Round(priceDecimal * 100))
Else
    ' 处理解析失败的情况:记录日志或者抛出明确错误
    Throw New InvalidOperationException($"无法解析支付金额:{Session("CardPaymentTotalPrice")}")
End If

orderRequest.currency = "DKK"

关键改进点

  • 安全解析:用Decimal.TryParse替代Convert.ToInt32,可以优雅处理无效格式的金额,避免未捕获的异常。
  • 格式标准化:处理丹麦地区的逗号小数点格式,确保解析正确。
  • 符合Bambora要求:将金额转换为最小货币单位的整数,避免金额错误和格式问题。
  • 清理冗余内容:移除可能存在的货币符号,确保解析的是纯数字字符串。

调试建议

如果还是报错,先在调试模式下查看Session("CardPaymentTotalPrice")的实际值,确认:

  • 有没有非数字字符(比如空格、字母)
  • 小数点/千位分隔符的格式是否符合预期

内容的提问来源于stack exchange,提问作者RJ2012

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 04:28:11