2013-03-15 2 views
4

В .NET мне нужно (если возможно) различать различные типы японских строк чисел.Отличие между японскими форматами чисел

В строках японских чисел можно записать по-разному, например для "1" есть "1", "ⅰ", "Ⅰ", "①" в половинной ширины.

Мне нужно сравнить строки, такие как "MyString1" и "MyString①", и по понятным причинам они не равны. Мне интересно, есть ли способ автоматического изменения символов "①" на "1" автоматически?

EDIT

Я знаю, что очевидный ответ был бы составить список всех возможных «①» символы типа (имеется конечное число тех) и заменить их в целевой строке. Но это не очень «хороший» способ сделать это, по моему мнению, и не очень надежный ... поэтому, если есть общий способ, я бы скорее использовал это.

EDIT

Извиняюсь, я ранее писал, что бот "①" и "1" считаются цифры, но они не являются. IsNumeric "①" подходит как ложный. Поэтому я думаю, что вообще не может быть никакого способа переключиться с одного на другой, кроме прямой подстановки.

+0

Вы просмотрели http://msdn.microsoft.com/en-us/library/a7zyyk0c.aspx и играли с CultureInfo? – Dutts

+0

@ Richard Я собирался предложить то же самое и просто попробовал это, но 'Compare' возвращает' '1" и '" ① "' разные, даже не чувствительные к регистру в культуре ja-JP. –

+0

@Richard Спасибо за ссылку. Строки и CultureInfo действительно то, с чем я не знаком, поэтому не уверен, что смогу использовать его, хотя ... –

ответ

4

fileformat.info говорит, что circled digits можно разложить на обычные цифры. Тыкая в этом in ideone показывает, что normalization forms, что будет добиваться того, чтобы в .NET являются 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 

Тем не менее, есть один нюанс в том, что нормализующее строку может также MANGLE другие символы, которые вы хотите остаться как- является.

+0

Спасибо за ваш ответ. Поскольку я хочу избежать манипулирования строкой, как вы сказали, я перебираю и изменяю только символы, которые появляются как числовые, используя 'Char.getNumericValue()', как я сказал в своем ответе. Я собираюсь принять это как ответ, хотя, потому что я думаю, что это лучше, чем у меня :) –

1

OK, играя с вещами, я обнаружил, что я могу преобразовать «①», чтобы это числовое значение ("1"), используя Char.GetNumericValue() что довольно интересно, потому что IsNumeric("①") приходит в False.

И это также, кажется, работает на «ⅰ» и «Ⅰ» (не буквы, но формат японского номера для «1»)

Я желаю я понял, культура меняется больше ...

+0

Это, вероятно, факт, похороненный где-то глубоко в недрах спецификации Юникода. fileformat.info перечисляет какой-то «числовой эквивалент» для символов, который должен быть возвращен «GetNumericValue()». Однако факт, что символ имеет числовой эквивалент, вероятно, не означает, что сам символ является числовой цифрой. Я предполагаю, что 'IsNumeric()' это то же самое, что и слово «является символом в' Nd' »(* Числовой, цифра *), однако цифры в круге -' No' (* Numeric, other *) – millimoose

+0

Большое спасибо за вы объяснения. Эти типы символов обычно используются для списков накапливания, поэтому это должно быть почему. Другой странный материал состоит в том, что, хотя в западной культуре вы использовали «i» или «I», чтобы напечатать список, японские «ⅰ» и «Ⅰ» отличаются. В очередной раз благодарим за помощь! –

+0

Кроме того, согласно документации, 'Char.IsNumber()' должен распознавать те же символы, что и Char.GetNumericValue() 'как числовые, поэтому вы можете использовать это вместо' IsNumeric() '. (Не можете найти, откуда эта функция, это вещь VB?) – millimoose

Смежные вопросы