Ответ 1
Ответ: Unicode Code Charts - где вы найдете Таблица дополнений Latin-1; это показывает, что U + 00A0 (160 в соответствии с вашим названием, а не 167 в соответствии с телом) является неразрывным пространством.
Я форматирования чисел в строку, используя следующую строку формата "# #. ##", в какой-то момент мне нужно вернуть эти числовые строки, например (1 234 567), примерно в 1234567. Я пытаюсь пустые символы, но обнаружили, что
value = value.Replace(" ", "");
по какой-то причине, и строка остается 1 234 567. После просмотра строки я обнаружил, что
Значение[1] равно 160.
Мне было интересно, что означает значение 160?
Ответ: Unicode Code Charts - где вы найдете Таблица дополнений Latin-1; это показывает, что U + 00A0 (160 в соответствии с вашим названием, а не 167 в соответствии с телом) является неразрывным пространством.
Возможно, вы могли бы использовать регулярное выражение для замены этих пустых символов:
Regex.Replace(input, @"\p{Z}", "");
Это приведет к удалению любого пробела или невидимого разделителя.
char code 160
будет
value.Replace(Convert.ToChar(160).ToString(),"")
Это быстрый (и достаточно читаемый) способ удаления любых символов, классифицированных как пробел, с помощью 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();
Я бы предложил использовать char версию перегрузки:
value = value.Replace(Convert.ToChar(160), ' ')
Решение с расширенными методами:
public static class ExtendedMethods
{
public static string NbspToSpaces(this string text)
{
return text.Replace(Convert.ToChar(160), ' ');
}
}
И он может использоваться с этим кодом:
value = value.NbspToSpaces();
Не был бы предпочтительным методом для замены всех пустых символов (и это то, что хотел задать вопросник) с помощью метода Regex, который уже опубликовал Rubens?
Regex.Replace(input, @"\p{Z}", "");
или то, что предлагает Expresso:
Regex.Replace(input, @"\p{Zs}", "");
Различие заключается в том, что \p {Z} заменяет любой вид пробела или невидимого разделителя, тогда как \p {Zs} заменяет пробельный символ, невидимый, но занимает пробел. Вы можете прочитать его здесь (раздел Unicode Categories):
http://www.regular-expressions.info/unicode.html
Использование RegEx имеет то преимущество, что требуется только одна команда, чтобы заменить также обычные пробелы, а не только неразрывное пространство, как описано в некоторых ответах выше.
Если производительность - это путь, то, конечно, следует учитывать другие методы, но здесь это не доступно.