Преобразовать Float с периодом вместо запятой?
У меня есть данные из таблицы в базе данных (строка), содержащие текст и цену. Я извлекаю цену из данных, но моя проблема в том, что когда-нибудь я могу преобразовать ее в float, а иногда нет.
Я заметил, что:
Convert.ToSingle(m.Groups[1].Value);
Это работает, но не всегда, потому что когда-то период является проблемой (для этого требуется запятая). Что я могу сделать? Я пытаюсь заменить "." На ",", но когда-нибудь на другом ПК это период, который он требовал!
Ответы
Ответ 1
У вас есть эта проблема, потому что конверсия проверяет язык вашего ПК. Вам нужно будет сделать что-то вроде:
Convert.ToSingle(m.Groups[1].Value, CultureInfo.InvariantCulture.NumberFormat);
Эти способы не будут проверять язык ПК. Вы можете найти более подробную информацию о InvariantCulture из MSDN. У меня есть что-то подобное в проекте, и мое преобразование работает.
Ответ 2
Или просто укажите этот формат номера:
System.Globalization.NumberFormatInfo nf
= new System.Globalization.NumberFormatInfo ( )
{
NumberGroupSeparator = "."
};
float f = float.Parse ( "5.34534", nf );
Ответ 3
Если у вас нет доступа на запись в базу данных, первое, что нужно сделать, это попытаться и убедить источники данных использовать инвариантную культуру. Если данные вводятся пользователем, вы можете сделать что-то вроде:
float f = float.Parse(input);
string toDb = f.ToString(CultureInfo.InvariantCulture);
И затем с другой стороны:
float f = float.Parse(fromDb, CultureInfo.InvariantCulture);
string toOutput = f.ToString();
Хотя, если вы можете убедить их в этом, вероятно, лучше, как говорит Летте, убедить их использовать собственный тип данных.
Я также хотел бы, как видно из вышеприведенных фрагментов, переформулировать использование float.Parse over Convert по разным причинам, но наиболее важным из них является возможность использования TryParse:
float f;
if (!float.TryParse(input, out f))
{
// ERROR
}
Ответ 4
Как говорили другие:
Convert.ToSingle(m.Groups[1].Value, CultureInfo.InvariantCulture);
Вы также должны убедиться, что используете InvariantCulture
, когда записываете в базу данных. (Было бы даже лучше, если бы вы сохранили данные в столбце с его собственным типом данных, но я отвлекся...)