2010-01-25 2 views
35

Я форматирования чисел в строку, используя следующую строку формата «# #. ##», в какой-то момент мне нужно вернуть эти числовые строки, например (1 234 567), в нечто вроде 1234567. Я пытаюсь пустые символы, но обнаружил, чтоЧто означает char 160 в моем исходном коде?

value = value.Replace(" ", ""); 

по какой-то причине и строки остаются 1 234 567. После того, как смотреть на строку, я обнаружил, что

значение [1] является 160.

Мне было интересно, что значение 160 означает?

+2

В Windows есть красивый апплет, который открывает эти коды Unicode. Использовать Charmap.exe –

+0

Я попытался запустить его, но не смог на Windows 2008 – gyurisc

+0

@HansPassant Вы сказали апплет в 2010 году? – asyncwait

ответ

41

Ответ должен выглядеть в Unicode Code Charts - где вы найдете Latin-1 supplement chart; это показывает, что U + 00A0 (160 в соответствии с вашим названием, а не 167 в соответствии с телом) является неразрывным пространством.

2

Это быстро (и довольно читаемым) способ удаления каких-либо символов, классифицированных как белое пространство с помощью Char.IsWhiteSpace:

StringBuilder sb = new StringBuilder (value.Length); 
foreach (char c in value) 
{ 
    if (!char.IsWhiteSpace (c)) 
     sb.Append (c); 
} 
string value= sb.ToString(); 

Как dbemerlin указывает, если вы знаете, что нужно только цифры от ваших данных, вы было бы лучше использовать Char.IsNumber или еще более ограничительным Char.IsDigit:

StringBuilder sb = new StringBuilder (value.Length); 
foreach (char c in value) 
{ 
    if (char.IsNumber(c)) 
     sb.Append (c); 
} 
string value= sb.ToString(); 

Если вам нужны цифры и десятичные сепаратора обеспечивают, что-то вроде этого должно хватить:

StringBuilder sb = new StringBuilder (value.Length); 
foreach (char c in value) 
{ 
    if (char.IsNumber(c)|c == System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator) 
     sb.Append (c); 
} 
string value= sb.ToString(); 
+0

Как насчет десятичного разделителя? Будет ли Char.IsDigit() и Char.IsNumber() пропустить это тоже? – gyurisc

+0

@ AskAboutGadgets.com, yes IsNumber и IsDigit возвращают false для десятичного разделителя. Я добавил новый пример –

+0

Я бы предпочел "||" в условии вместо "|" для удобочитаемости. – Xantix

10

value.Replace(Convert.ToChar(160).ToString(),"")

+0

value.Replace (((char) 160) .ToString(), "") для менее типизации – cryss

0

решение с расширенными методами:

public static class ExtendedMethods 
{ 
    public static string NbspToSpaces(this string text) 
    { 
     return text.Replace(Convert.ToChar(160), ' '); 
    } 
} 

И он может быть использован с этим кодом:

value = value.NbspToSpaces(); 
0

Не был бы предпочтительным методом для замены всех пустых символов (и это то, что хотел сделать пользователь) с помощью метода регулярных выражений, который уже опубликовал Рубенс?

Regex.Replace(input, @"\p{Z}", ""); 

или что Экспрессо предлагает:

Regex.Replace(input, @"\p{Zs}", ""); 

Разница здесь в том, что \ р {Z} заменяет любые пробелы или невидимого сепараторе, тогда как \ р {Zs} заменяет символ пробела, который невидимым, но занимает место. Вы можете прочитать здесь (раздел Unicode Категории):

http://www.regular-expressions.info/unicode.html

Использование регулярных выражений имеет то преимущество, что только одна команда необходима для замены также нормальные пробельные и не только неразрывный пробел, как объяснено в некоторых ответы выше.

Если производительность - это путь, то, конечно, следует учитывать другие методы, но здесь это не доступно.

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