2014-11-16 2 views
1

мне нужно знать, если есть способ разбора string с не обычным форматом до double, например:.Строка удвоить число (в формате ## ###, ##).

string str = "1.500,43"; 

к

double num = 1500.43; 

Моя попытка не работает. Я получаю 0:

double number=0; 
double.TryParse("1.500,43", out number); 

Я знаю, что я могу просто удалить "." и изменить "," к "." и чем делать TryParse, но я хочу найти другой путь.

Кто-нибудь знает, как это сделать?

+0

Что вы 'CurrentCulture'? –

+0

Это в Италии банк. –

+0

Если вы используете TryParse, вы должны проверить результат (boolean), если только требуемое поведение не будет равным 0, если синтаксический анализ завершится неудачно - и это, похоже, не так, поскольку вы жалуетесь на результат 0. –

ответ

5

Если вы не используете IFormatProvider с вашим методом double.TryParse, он использует ваш CurrentCulture по умолчанию.

Вероятно, ваши CurrentcCulture «s NumberDecimalSeparator или/и NumberGroupSeparator свойства не совпадают с , и ..

В качестве решения вы можете: .CloneCurrentCulture и задать следующие параметры:;

var culture = (CultureInfo)CultureInfo.CurrentCulture.Clone(); 
culture.NumberFormat.NumberDecimalSeparator = ","; 
culture.NumberFormat.NumberGroupSeparator = "."; 
double number; 
if(double.TryParse("1.500,43", NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, 
        culture, out number)) 
{ 
    // Successful parsing 
} 

В общем, замене . и , с строковых методов не является хорошей идеей.

+1

Вы забыли использовать клонированную «культуру». –

+0

@Mathew Ups, извините. Исправлена. Благодарю. –

+0

Поскольку мы, по-видимому, не хотим, чтобы значение по умолчанию равнялось 0, если синтаксический анализ не сработает, мы должны использовать TryParse здесь? Не лучше ли использовать Parse и дать исключение, если синтаксический анализ завершится неудачей? Или, у вас есть 'if (! Double.TryParse (... {do something'? –

1

Предполагая, что ваш CultureInfo немецкий вы можете использовать это:

var culture = new CultureInfo("de"); 
double number = 0; 
double.TryParse("1.500,43", NumberStyles.Number, culture, out number); 

Конечно, это работает и в других культурах, где десятичный разделитель и разделитель тысяч различны. Просто используйте код культуры вашей страны

2

Вы должны указать TryParse, какую культуру использовать при попытке конвертировать строку. Формат, который у вас есть, используется в Continental Europe с десятичной запятой и полной остановкой для разделителя тысяч.

Сначала вы можете попробовать английский формат, а затем Continental, если это не удается, но есть случаи, которые будут преобразованы в действительные, но разные номера, если разделитель тысяч опущен.

Было бы лучше настаивать на том, что цифры вводятся в одном формате или вы выбираете формат из локали пользователя. Хотя последний подход может потерпеть неудачу, если у вас есть кто-то, использующий сайт из разных локалей (например, английский человек в Германии).

+0

Принудительно, поскольку действительно рекомендуется настаивать на определенном входном формате. –

1

Вы можете позвонить .ToString и .Parse со следующим параметром

нового System.Globalization.NumberFormatInfo()

, на котором вы можете установить свойство NumberDecimalSeparator в запятую.

Таким образом, вам не нужно связываться с культуинфой, но можете установить его по требованию.

Edit: Как и

double.Parse("1.500,43", new System.Globalization.NumberFormatInfo() 
                { 
                 NumberDecimalSeparator = ",", 
                 NumberGroupSeparator = "." 
                }); 
Смежные вопросы