Преобразовать 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, когда записываете в базу данных. (Было бы даже лучше, если бы вы сохранили данные в столбце с его собственным типом данных, но я отвлекся...)