2015-10-12 5 views
0

У меня есть строковое значение для суммы, поступающей из БД. Местная культура в моей системе - португальский (pt-br). В результате сумма с десятичными значениями считывается как, например, 3,4 для 3.4. Мне нужно разобрать это так, чтобы оно отображало 3,4, но вместо этого, независимо от того, что я пытаюсь получить, мне становится 34. Я искал все, где было решение, и попытался реализовать ниже, но напрасно.Разбор значения с десятичными точками

// здесь грести [item.columnName] является строка DataTable, который я зацикливание

Решение 1:

Double amt = Double.Parse(Convert.ToString(row[item.columnName]), CultureInfo.InvariantCulture); 

Решение 2:

CultureInfo usCulture = new CultureInfo("en-US"); 
NumberFormatInfo dbNumberFormat = usCulture.NumberFormat; 
Double amt = Double.Parse(Convert.ToString(row[item.columnName]), dbNumberFormat); 

Ни один из они, похоже, работают. Может кто-нибудь подскажет, есть ли другой способ добиться этого?

EDIT:

Оказывается, что значение я получаю от БД типа десятичной, так что я изменил мою LOC ниже.

decimal d = decimal.Parse(Convert.ToString(row[item.columnName]),new System.Globalization.CultureInfo("pt-BR", false)); 

Он все еще не работает, и я просто не вижу, где я ошибаюсь. Я пробовал то же самое на DotNetFiddle , и он работает абсолютно нормально. Ниже приведен код, который я пробовал.

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     decimal d = decimal.Parse("1,35",new System.Globalization.CultureInfo("pt-BR", false)); 
     Console.WriteLine(d.ToString()); 
    } 
} 

В результате я получил 1,35, как ожидалось. Что я делаю не так?

+1

Можете ли вы уточнить: какая именно строка исходит из 'Convert.ToString (row [item.columnName])'? Если в нем есть запятая, то разбор его как InvariantCulture, конечно, не сработает. Вы должны использовать культуру PT-br. –

+0

Является ли 'row [item.columnName] .GetType()' уже численным типом? –

+1

Вы действительно храните строку в своем db? Я сомневаюсь, потому что если так вам не понадобится вызов Convert.ToString. Итак, каков тип столбца db? –

ответ

0

Вы можете попробовать так:

var x = decimal.Parse("yourDecimal", new NumberFormatInfo() { NumberDecimalSeparator = "," }); 
0

Вы можете использовать potrugal данные культуры

CultureInfo usCulture = new CultureInfo("pt-PT", false); 
NumberFormatInfo dbNumberFormat = usCulture.NumberFormat; 
Double amt = Double.Parse(Convert.ToString(row[item.columnName]), dbNumberFormat); 

или

Double amt = Double.Parse(Convert.ToString(row[item.columnName]), new CultureInfo("pt-PT", false)); 
+0

Это не поможет. Это дает мне значение 3,4, в то время как я ищу 3,4 – Akshatha

+0

привет Акшатха, я предполагаю, что ваша БД, а также сервер приложений находятся в pt-br, поэтому при загрузке вам, возможно, придется конвертировать в международную или английскую культуру. Если вам нужно распечатать двойной экран, вам придется конвертировать в томе отображения Double amt = Double.Parse («1.233,4», новый CultureInfo («pt-BR», false)); Console.WriteLine (amt); Console.WriteLine (amt.ToString (новая версия CultureInfo («pt-BR», false))); Console.WriteLine (amt.ToString (new CultureInfo ("en", false))); Это работает для меня –

0

Если вы получаете двойные значения из базы данных, то это не является проблемой синтаксического анализа. В Решение 1 вы преобразуете правильные двойные значения в строку (без указания какой-либо культуры, поэтому строка будет отформатирована в португальском формате), а затем вы проанализируете португальские строки с инвариантной культурой, где , - это тысячный разделитель.

Вы должны просто установить текущую культуру английский язык, если вы хотите форматировать число с английской культурой:

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); 

Или просто указать культуру при преобразовании двойной в строку:

var en = CultureInfo.GetCultureInfo("en-US"); 
// ... 
((double)row[item.columnName]).ToString(en); 
0

Может быть row[item.columnName] уже есть double? Что возвращает row[item.columnName].GetType()?

Нет причин брать (в штучной упаковке) double и форматировать его в строку (без указания культуры), а затем разобрать эту строку на double (указав культуру).Даже если Convert.ToString имеет перегрузку, которая принимает в качестве второго параметра IFormatProvider (который может быть CultureInfo).

Может

double amt = (double)row[item.columnName]; 

будет работать? Если у вас есть decimal, используйте либо decimal amt = (decimal)row[item.columnName];, либо double amt = (double)(decimal)row[item.columnName];.

Если row[item.columnName].GetType() действительно String, отливать в том, что:

double amt = Double.Parse((string)row[item.columnName], someGoodCulture); 

Я лично не нравится Convert.ToString так как трудно увидеть, если он просто вниз бросает string уже присутствует, или форматирует некоторые IFormattable экземпляр (например, как double или decimal) в соответствии с текущей культурой текущего потока или просто вызывает .ToString() на каком-либо произвольном объекте.