使用Bambora订单请求代码时出现无效字符串格式错误,寻求技术指导
解决Bambora订单请求中的「无效字符串格式」错误
看起来你的问题大概率出在金额字符串转换为整数的步骤上,咱们一步步来排查和修复:
问题根源分析
你当前的代码直接把金额字符串转成Int32,但忽略了几个关键问题:
- 丹麦克朗(DKK)的金额通常带有小数(比如
199,95或者199.95),直接用Convert.ToInt32转换带小数点的字符串会触发格式错误。 - Bambora的
amount字段要求的是最小货币单位的整数(比如199.95 DKK等于19995 øre),你直接转整数会丢失精度,同时格式转换也会失败。 - 如果
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
相关产品推荐
相关产品推荐

