【问题标题】:Distinguishing between Japanese number formats区分日语数字格式
【发布时间】:2013-03-15 02:11:17
【问题描述】:

在 .NET 中,我需要(如果可能)区分不同类型的日语数字字符串。

在日语中,数字字符串可以用不同的方式书写,例如 "1""1""ⅰ""Ⅰ""①" 的半角字符。

我需要比较"MyString1""MyString①" 之类的字符串,显然它们不相等。 我想知道是否有办法自动将"①"类型字符自动更改为"1"

编辑

我知道显而易见的答案是列出所有可能的“①”类型字符(这些字符的数量是有限的)并在目标字符串中替换它们。但在我看来,这不是一个非常“好”的方式,也不是很健壮......所以如果有一个通用的方式,我宁愿使用它。

编辑

抱歉,我之前写过机器人 "①""1" 被认为是数字,但它们不是。 IsNumeric "①" 出现错误。所以我想除了使用直接替换之外,实际上可能根本没有办法从一个切换到另一个。

【问题讨论】:

  • 你看过msdn.microsoft.com/en-us/library/a7zyyk0c.aspx并玩过CultureInfo吗?
  • @Richard 我打算提出相同的建议并尝试过,但 Compare 返回 "1""①" 是不同的,甚至在“ja-JP”文化中不区分大小写。
  • @Richard 感谢您的链接。 Strings 和 CultureInfo 真的是我不熟悉的东西,所以不确定我是否能够使用它......
  • @abatishchev 我已经尝试Equals 与所有三种类型的文化比较,但没有乐趣。
  • 您是否还说您希望MyStringii 和`MyString2' 相等?这对我来说似乎是个麻烦。

标签: .net string string-comparison


【解决方案1】:

fileformat.info 告诉我circled digits 可以分解为常规数字。戳这个in ideone 表明,将在.NET 中实现这一目标的normalization forms 是KC 或KD:

var one  = "①";
Console.WriteLine(one);

Console.WriteLine(one.Normalize(NormalizationForm.FormC)); // ①
Console.WriteLine(one.Normalize(NormalizationForm.FormD)); // ①

Console.WriteLine(one.Normalize(NormalizationForm.FormKC)); // 1
Console.WriteLine(one.Normalize(NormalizationForm.FormKD)); // 1

也就是说,需要注意的是,规范化字符串也可能会破坏您希望保持原样的其他字符。

【讨论】:

  • 感谢您的回答。因为我想避免像你说的那样破坏字符串,所以我正在循环遍历并且只更改使用Char.getNumericValue() 以数字形式出现的字符,正如我在回答中所说的那样。不过我会接受这个作为答案,因为我认为它比我的要好:)
【解决方案2】:

好的,玩弄我发现我可以使用Char.GetNumericValue() 将“①”转换为它的数值("1")的东西,这很有趣,因为IsNumeric("①") 出现为False

这似乎也适用于“ⅰ”和“Ⅰ”(不是字母,而是“1”的日语数字格式)

我希望我能更多地了解文化变化......

【讨论】:

  • 这可能是隐藏在 Unicode 规范深处某个地方的一个事实。 fileformat.info 列出了某种字符的“数字等价物”,这必须是GetNumericValue() 返回的内容。然而,一个字符确实有一个数字等价物这一事实可能并不意味着该字符本身就是一个数字。我猜IsNumeric() 与说“是Nd 中的字符”(数字,数字)相同,但带圆圈的数字是No数字,其他) i>)
  • 非常感谢您的解释。这些类型的字符通常用于项目符号列表,所以这一定是原因。其他奇怪的事情是,虽然在西方文化中你会使用“i”或“I”来标明列表,但日语的“ⅰ”和“Ⅰ”是不同的。再次感谢您的帮助!
  • 另外,根据文档,Char.IsNumber() 应该将与Char.GetNumericValue() 相同的字符识别为数字,因此您可以使用它而不是IsNumeric()。 (找不到那个函数是从哪里来的,是VB的东西吗?)
  • 是的,IsNumeric() 是 VB6 的遗留物。我知道这是不好的做法,但它很容易使用(有时有点危险)。感谢IsNumber() 的提示。 GetNumericValue() 似乎为非数字值返回 -1,所以我正在使用它。当然,现在我想知道是否存在价值为-1 的非数字字符。为了安全起见,我将使用IsNumber(),然后使用GetNumericValue() 进行连接。谢谢!
猜你喜欢
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多