网页爬取中非阿拉伯数字转int失败,求解决方案
解决非拉丁数字转int的问题
嘿,我来帮你搞定这个头疼的转换问题!你碰到的是非ASCII数字字符转换的典型坑——"۲۳"是波斯(属于阿拉伯数字体系)的数字字符,.NET默认的int.Parse和Convert.ToInt32只会认0-9的拉丁数字,直接转肯定会报「输入字符串格式不正确」的错误。而且你之前试的编码转换完全没用,因为编码转换只是改变字符的字节存储格式,根本没把波斯数字字符换成拉丁数字,自然还是转失败啦。
给你两个靠谱的解决方案:
方法一:指定对应文化(推荐)
直接利用.NET的文化信息(CultureInfo),让Parse方法识别波斯数字。波斯文化的代码是fa-IR,阿拉伯文化(比如沙特阿拉伯ar-SA)也能识别这类数字,代码示例:
using System.Globalization; // 你的波斯数字字符串 string persianNumber = "۲۳"; // 用波斯文化解析 int convertedNum = int.Parse(persianNumber, new CultureInfo("fa-IR")); // 或者用阿拉伯文化也可以 // int convertedNum = int.Parse(persianNumber, new CultureInfo("ar-SA")); Console.WriteLine(convertedNum); // 输出:23
原理很简单:指定文化后,Parse会根据该文化的NumberFormatInfo自动映射非拉丁数字到对应的拉丁数字,完成转换。
方法二:手动字符映射
如果不想依赖文化信息,也可以手动创建字符映射字典,把波斯数字替换成拉丁数字后再转换:
using System.Linq; using System.Collections.Generic; // 构建波斯数字到拉丁数字的映射字典 var persianToLatin = new Dictionary<char, char> { {'۰', '0'}, {'۱', '1'}, {'۲', '2'}, {'۳', '3'}, {'۴', '4'}, {'۵', '5'}, {'۶', '6'}, {'۷', '7'}, {'۸', '8'}, {'۹', '9'} }; string persianNumber = "۲۳"; // 替换所有波斯数字字符 string latinNumber = new string( persianNumber.Select(c => persianToLatin.ContainsKey(c) ? persianToLatin[c] : c).ToArray() ); // 现在就可以正常转int了 int convertedNum = int.Parse(latinNumber); Console.WriteLine(convertedNum); // 输出:23
额外提醒
如果你的字符串里可能混有其他非数字字符,建议用int.TryParse来做安全转换,避免抛出异常:
if (int.TryParse(persianNumber, NumberStyles.Any, new CultureInfo("fa-IR"), out int num)) { Console.WriteLine($"转换成功:{num}"); } else { Console.WriteLine("字符串包含无效字符,转换失败"); }
内容的提问来源于stack exchange,提问作者Amirreza
相关产品推荐
相关产品推荐

