2012-06-13 16 views
9

Chúng tôi hiện đang sử dụng sau đây để tạo giá trị đồng đô la Mỹ trong ứng dụng web của chúng tôi:Làm thế nào để sử dụng NumberFormatInfo để loại bỏ ngoặc cho các giá trị tiêu cực

string.Format("{0:C0}", dollarValue); 

Trong ví dụ này, nếu dollarValue là 145, sau đó chúng tôi sẽ xem: $ 145. Nếu đó là -145, thì chúng ta sẽ thấy ($ 145) thay vì - $ 145. Lưu ý rằng đối với chúng tôi, dollarValue là gấp đôi, nhưng nó có thể là bất kỳ loại số nào. Tôi nghĩ.

Dù sao, những gì tôi muốn là cho nó hoặc là $ 145 hoặc - $ 145.

Bây giờ, theo nghiên cứu của tôi, có thể thực hiện điều này bằng cách sử dụng lớp NumberFormatInfo. Tôi không thể tìm ra cách sử dụng nó và tôi không thể tìm thấy bất kỳ ví dụ hợp lệ nào. Tôi đã nhìn thấy câu hỏi này ở đây: C# creating a custom NumberFormatInfo to display "Free" when a currency value is $0.00 nhưng ví dụ từ MSDN liên kết đến từ câu hỏi này có vẻ hơi khác so với những gì tôi thực sự muốn làm.

Tôi nhận ra, tôi sẽ cần phải làm một cái gì đó trong các cách sau:

double dollarValue = -145d; 
string myMoney = dollarValue.ToString("C0", someIFormatProvider); 

nơi someIFormatProvider có khả năng loại NumberFormatInfo. Bây giờ, những gì tôi đã làm là:

NumberFormatInfo ni = new NumberformatInfo(); 
ni.CurrencyNegativePattern = 1; // The value 1 should mean not to use parenthesis 
string myMoney = dollarValue.ToString("C0", ni); 

... và tôi nhận được ngoại lệ "Ví dụ là chỉ đọc". Trong khi "tài liệu" cho thuộc tính CurrencyNegativePattern cho biết bạn có thể SET và GET giá trị, rõ ràng là bạn không thể. Ngoài ra, NumberFormatInfo là một lớp niêm phong. Tôi không thể dễ dàng tạo một lớp mới dựa trên nó và ghi đè lên giá trị.

Tôi đang thua lỗ về cách giải quyết vấn đề này. Ngay bây giờ, giải pháp thay thế của tôi là chỉ phủ nhận giá trị âm của tôi và có kết quả tích cực là tôi làm lại string.Format(...). Có, tôi nhận ra không có dấu hiệu tiêu cực trước điều này, nhưng, tất nhiên, điều đó dễ dàng được giải quyết bằng cách thêm "-" trước kết quả khi cần.

Ai đó có thể cung cấp cho tôi một ví dụ làm việc về cách sử dụng hiệu quả lớp NumbefFormatInfo chính xác trong tình huống này không? Cảm ơn.

+0

Bạn có chắc chắn lỗi đến từ việc thiết lập CurrencyNegativePattern của một cá thể NumberFormatInfo? Tôi đã nhìn thấy ngoại lệ chỉ đọc này, nhưng nó được nâng lên từ cố gắng sửa đổi các thuộc tính CurrentUICulture? – Tisho

+0

Mã hoạt động cho tôi (sau khi sửa trường hợp trên 'NumberformatInfo') –

Trả lời

2
double dollarValue = -145d; 
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US"); 
string mymoney = dollarValue.ToString("C", modCulture); 
      MessageBox.Show(mymoney); 

Nếu hệ điều hành của bạn văn hóa hiện nay là en-US sau đó bạn không cần dòng sau

System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US"); 

Mã sẽ là

double dollarValue = -145d; 
string mymoney = dollarValue.ToString("C"); 

và Nếu bạn muốn làm gì với NumberFormatInfo

double dollarValue = -145d; 
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US"); 
    NumberFormatInfo number = modCulture.NumberFormat; 
    string mymoney = dollarValue.ToString("C", number); 

một cách khác

double dollarValue = -145d; 
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US"); 
NumberFormatInfo number = modCulture.NumberFormat; 
string mymoney = dollarValue.ToString(String.Format("C",number)); 
Console.WriteLine(mymoney); 
+0

Và đây là [doc] (http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.currencynegativepattern.aspx). –

+1

Tôi đã thử câu trả lời này trong một ứng dụng giao diện điều khiển để kiểm tra và kết quả là ($ 145). Nếu tôi sử dụng "C" thay vì "0: C0", đối với định dạng, tôi nhận được ($ 145,00). – Dan7el

+0

hãy kiểm tra câu trả lời đã chỉnh sửa. – MMK

3

Hãy thử này ...

string.Format("{0:$#.;-$#.}", -145) 

hoặc

dollarValue.ToString("$#.;-$#.") 
+0

Bạn cần trao đổi' $ 'và' -'. –

+0

Và dĩ nhiên, 'string.Format (" {0: $ #.; - $ #.} ", DollarValue)' tương đương với 'dollarValue.ToString (" $ #.; - $ #. ")' Trong giống như 'string.Format (" {0: C0} ", dollarValue)' tương đương với 'dollarValue.ToString (" C0 ")'. –

+0

@Jeppe định dạng cố định .... cảm ơn cho bắt ... và tôi thích tùy chọn thứ hai của bạn tốt hơn một chút ... thay đổi để phản ánh điều này. –

1

'dụ là ReadOnly' có nghĩa là bạn có một trường hợp chỉ đọc của NumberFormatInfo.Bạn có thể nhận được một thể hiện có thể ghi bằng cách sao chép một cá thể chỉ đọc:

NumberFormatInfo writeable = (NumberFormatInfo) ni.Clone(); 
1

Bạn có chắc chắn không thể chỉ định CurrencyNegativePattern không? Tôi đã thử với mã này:

double dollarValue = -145d; 
System.Globalization.NumberFormatInfo ni = new System.Globalization.NumberFormatInfo(); 
ni.CurrencyNegativePattern = 1; 
dropDownList.Items.Add(new ListItem(dollarValue.ToString("C0", ni))); 

và thành công của nó.

10

Bạn có thể tạo bản sao của thuộc tính NumberFormat trong CurrentCulture (điều này sẽ đảm bảo rằng bạn giữ biểu tượng tiền tệ chính xác nếu bạn toàn cầu hóa đơn đăng ký của mình). Sau đó, chỉ cần đặt các CurrencyNegativePattern tài sản với giá trị mong muốn và vượt qua trong NumberFormatInfo của bạn trong double.ToString() chức năng, như vậy:

NumberFormatInfo noParens = (NumberFormatInfo)CultureInfo.CurrentCulture.NumberFormat.Clone(); 
noParens.CurrencyNegativePattern = 1; 
double dollarValue = -145d; 
string output = dollarValue.ToString("C0", noParens); // outputs -$145 
+0

Thú vị. Cảm ơn bạn, điều này đã làm việc. Tôi vui mừng khi thấy tôi không quá xa về việc thực hiện tổng thể. Tôi không biết tôi cần sao chép nó. – Dan7el

+1

Điều này cũng sẽ cho phép bạn sử dụng văn hóa hiện tại, do đó bạn không cần phải mã hóa nó thành "en-US" trong trường hợp bạn kết thúc toàn cầu hóa ứng dụng web của mình. –

1

Để chắc chắn rằng bạn vẫn ở trong "Mỹ-bối cảnh" Tôi muốn làm điều gì đó như này:

double val = -145d; 
NumberFormatInfo nfi = new CultureInfo("en-US").NumberFormat; 
nfi.CurrencyNegativePattern = 1; 
val.ToString("C0", nfi).Dump(); 

Các Dump đến từ LinqPad, hiển thị -$145 như một kết quả.

Các lỗi mà bạn đang nhận được cảm giác như nó xuất phát từ bạn nhận được một cái gì đó NumberFormatInfo của bạn như thế này:

NumberFormatInfo nfi = Thread.CurrentThread.CurrentCulture.NumberFormat; 

Trong trường hợp mà tôi muốn thay thế bằng một cái gì đó như thế này:

NumberFormatInfo nfi = (NumberFormatInfo)Thread.CurrentThread.CurrentCulture.NumberFormat.Clone();