如何成功将double转为string?解决输入格式不正确报错问题
解决"Input string was not in a correct format"错误&Double转String的正确姿势
嘿,我来帮你梳理下问题所在和解决办法:
为啥会报格式错误?
你遇到的这个报错,核心问题出在Convert.ToDouble(exchange)这一步。GetNigerianExchange()从API拿到的汇率字符串,大概率和你当前系统的区域文化格式不兼容——比如API返回的是"42.56"(用点号当小数点),但如果你的系统区域设置是用逗号做小数点(比如欧洲部分地区),Convert.ToDouble()默认会按系统区域去解析,自然就识别不了,直接抛出格式错误。
另外,你用dynamic解析JSON的写法也有点风险,如果API返回的字段名有变动(比如拼写错了),拿到的exchange可能是空或者非数字字符串,也会触发这个错误。
一步步解决问题
1. 先搞定汇率字符串转Double的问题
别用Convert.ToDouble()的无参版本,直接指定**不变文化(InvariantCulture)**来解析,它强制用点号做小数点,完美匹配大多数API的返回格式:
// 替换原来的转换代码 double exchangeRate = double.Parse(exchange, System.Globalization.CultureInfo.InvariantCulture); var amount = (ol.Amount * exchangeRate).ToString("0.##");
要是想更稳妥,避免解析失败直接崩掉,就用double.TryParse做容错处理:
if (double.TryParse(exchange, System.Globalization.CultureInfo.InvariantCulture, out double exchangeRate)) { var amount = (ol.Amount * exchangeRate).ToString("0.##"); // 这里写后续的业务逻辑 } else { // 解析失败的情况,比如打个日志、给用户提示啥的 }
2. 优化API返回的解析逻辑
用dynamic解析JSON虽然灵活,但很容易因为字段名拼写错误掉坑,不如换成强类型模型来解析,更安全也更易维护:
// 先定义对应API返回结构的模型类 public class CurrencyExchangeResponse { [JsonProperty("Realtime Currency Exchange Rate")] public RealtimeExchangeRate RealtimeCurrencyExchangeRate { get; set; } } public class RealtimeExchangeRate { [JsonProperty("5. Exchange Rate")] public string ExchangeRate { get; set; } } // 然后修改GetNigerianExchange方法,用更现代的HttpClient替代HttpWebRequest private static string GetNigerianExchange() { var forexUrl = "https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency=ZAR&to_currency=NGN&apikey=ZRH58691ZX2ENX1U&datatype=json"; using (var httpClient = new HttpClient()) { // 同步调用,要是用异步的话可以改成await client.GetStringAsync(forexUrl) var jsonResult = httpClient.GetStringAsync(forexUrl).Result; var response = JsonConvert.DeserializeObject<CurrencyExchangeResponse>(jsonResult); // 空值保护,避免null引用 return response?.RealtimeCurrencyExchangeRate?.ExchangeRate ?? string.Empty; } }
注:这里用了Newtonsoft.Json,你需要先安装对应的NuGet包;如果想用.NET内置的System.Text.Json,把JsonProperty换成JsonPropertyName就行。
Double转String的正确打开方式
你当前用的.ToString("0.##")其实没问题,但根据不同场景,还有几种常用写法:
- 固定保留2位小数:比如不管数值有没有小数,都显示两位,用
.ToString("F2"),比如123.4会变成"123.40" - 避免区域影响输出格式:如果担心系统区域把小数点变成逗号,就指定不变文化输出:
var amountStr = amount.ToString("0.##", System.Globalization.CultureInfo.InvariantCulture); - 告别科学计数法:如果你的double值特别大或特别小,默认可能会用科学计数法,用
.ToString("G")可以自动切换成合适的普通格式,或者.ToString("N2")带千分位分隔符。
内容的提问来源于stack exchange,提问作者Zidane
相关产品推荐
相关产品推荐

