2013-01-03 25 views
8

Theo http://msdn.microsoft.com/en-us/library/6t7dwaa5.aspx, nếu tôi muốn hiển thị một số như một đồng tiền, tôi có thể gọi ToString() và vượt qua một tham số, trong trường hợp này "C"Int.ToString ("C") loại bỏ biểu tượng tiêu cực

Tuy nhiên, dựa trên các chi tiết bên dưới là từ trang MSDN, nó sẽ tự động xóa ký tự trừ (-), có nghĩa là giá trị của tôi bây giờ là dương.

int value = -16325; 
// Display value using default ToString method. 
Console.WriteLine(value.ToString());   // Displays -16325 
// Display value using some standard format specifiers. 
Console.WriteLine(value.ToString("G"));   // Displays -16325 
Console.WriteLine(value.ToString("C"));   // Displays ($16,325.00) 
Console.WriteLine(value.ToString("D"));   // Displays -16325 
Console.WriteLine(value.ToString("F"));   // Displays -16325.00 
Console.WriteLine(value.ToString("N"));   // Displays -16,325.00 
Console.WriteLine(value.ToString("X"));   // Displays FFFFC03B 

Vì vậy, làm cách nào để giữ biểu tượng dấu trừ, tôi phải sử dụng phương thức Chứa ("-") và nếu nó thêm đúng.

Một số nội dung như mã này (xin lỗi nếu mã được mã hóa sai, nhưng bạn có ý tưởng).

string x = (value.ToString().Contains("-") : "-" + value.ToString("C") ? + value.ToString("C")); 
+0

nếu bạn nhận được "-" thay thế bằng "(...)" như MSDN nói, nó là chính xác và nó phụ thuộc vào cài đặt khu vực cho người dùng trong bảng điều khiển cửa sổ, nếu người dùng muốn xem (thay vì trừ đi lý do tại sao ghi đè cài đặt của anh ấy/cô ấy? –

+3

** ngoặc ** là điều tiêu cực trong văn hóa hiện tại của ứng dụng –

+0

@DavidePiras - Câu hỏi hay, trong trường hợp này, phần mềm phải được thiết lập trên máy chủ từ xa phải nằm trong cài đặt khu vực đó cho 'chính' của chúng tôi phần mềm để chạy, ứng dụng của tôi chỉ là một bổ sung cho nó; tất cả mọi người nói tiếng Anh mặc dù và cho các tài khoản, nó phải hiển thị - hay không! – Dave

Trả lời

12

Điều này tùy thuộc vào giá trị CurrentCulture.NumberFormat.CurrencyNegativePattern của bạn.Giá trị có thể là 0-15:

0 : ($12,345.00) 
1 : -$12,345.00 
2 : $-12,345.00 
3 : $12,345.00- 
4 : (12,345.00$) 
5 : -12,345.00$ 
6 : 12,345.00-$ 
7 : 12,345.00$- 
8 : -12,345.00 $ 
9 : -$ 12,345.00 
10 : 12,345.00 $- 
11 : $ 12,345.00- 
12 : $ -12,345.00 
13 : 12,345.00- $ 
14 : ($ 12,345.00) 
15 : (12,345.00 $) 

Vì vậy, có vẻ như bạn muốn đặt nó vào 1 để có được đầu ra bạn là sau khi có cái gì đó như:

int value = -12345; 

var numberFormat = (NumberFormatInfo)CultureInfo.CurrentCulture.NumberFormat.Clone(); 
numberFormat.CurrencyNegativePattern = 1; 

string numberAsCurrency = value.ToString("C", numberFormat) 

Mặc dù, dựa trên ý kiến ​​của bạn về việc đó là máy chủ từ xa và bạn luôn muốn định dạng theo cách cụ thể có thể tốt hơn là chỉ đặt văn bản cho toàn bộ chuỗi thành giá trị được kiểm soát và điều này sẽ ảnh hưởng đến tất cả các cuộc gọi ToString() tiếp theo trên chủ đề đó:

int value = -12345; 
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); 
Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyNegativePattern = 1; 
string numberAsCurrency = value.ToString("C"); 
3

Tùy thuộc vào cài đặt bản địa hóa của máy. Đơn vị tiền tệ phủ định ở nhiều miền địa phương được biểu thị là (amount) Vì vậy, .net tại đây đang sử dụng. Tôi không chắc chắn làm thế nào để ghi đè lên điều này. Nhưng đó là những gì đang diễn ra ở đây.

+0

Cảm ơn bạn đã cung cấp thông tin này. – Dave

3

Điều này phụ thuộc vào văn hóa. Nó sử dụng NumberFormatInfo.CurrencyNegativePattern - ở Hoa Kỳ dường như sử dụng dấu ngoặc đơn để biểu thị số âm. (Một số dương sẽ không có dấu ngoặc đơn.)

Vì vậy, bạn có thể sao chép hiện tại của bạn CultureInfo, và thay đổi CurrencyNegativePattern của liên NumberFormatInfo - nhưng tôi muốn được cảnh giác làm điều đó. Nói chung, bạn nên tin tưởng rằng thông tin văn hóa mà .NET sử dụng phù hợp với văn hóa đó. Bạn cần phải quyết định xem bạn có muốn muốn hiển thị một đại diện văn hóa cụ thể hay không - tất nhiên - nếu không, bạn có thể muốn sử dụng văn hóa bất biến.

+0

Tôi đồng ý với việc thay đổi nó có thể có một ảnh hưởng tiêu cực, nhưng, trong trường hợp của tôi nó cho một báo cáo rất nhỏ mà chỉ hiển thị nếu lợi nhuận mục tiêu của chúng tôi là ở trên hoặc dưới đây! Cảm ơn bạn, mặc dù một lần nữa! – Dave

1

Bạn có thể sử dụng này:

string text = value < 0 ? "-" + (-value).ToString("C") : value.ToString("C"); 

Nhưng chắc chắn rằng các thiết lập nội địa không thay đổi để ngăn chặn kết quả không thể đoán trước (như - $ 1.00)

+0

Và bây giờ bạn có '- (123.45)' –

+0

Tôi biết. đã chỉnh sửa! – Willem

3

bạn có thể muốn thử này ra

 Console.WriteLine((-1234).ToString("c")); 
     CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture; 
     CultureInfo newCulture = new CultureInfo(currentCulture.IetfLanguageTag); 
     newCulture.NumberFormat.CurrencyNegativePattern = 1; 
     Thread.CurrentThread.CurrentCulture = newCulture; 
     Console.WriteLine((-1234).ToString("c")); 

MSDN: NumberFormatInfo.CurrencyNegativePattern Property để biết chi tiết ...

7

Bạn có thể tạo tùy chỉnh NumberFormatInfo từ ngôn ngữ hiện tại của mình. Sau đó, bạn có thể xác định nó là CurrencyNegativePattern, ví dụ:

int value = -16325; 
var culture = CultureInfo.CurrentCulture; 
var mutableNfi = (NumberFormatInfo)culture.NumberFormat.Clone(); 
mutableNfi.CurrencyNegativePattern = 1; 
Console.WriteLine(value.ToString("C", mutableNfi)); // Displays (-$16,325.00) 
0

Bạn có thể sử dụng phương pháp này để có được những chuỗi tiền tệ, và chỉ khi nó được đặt trong ngoặc vuông, loại bỏ các dấu ngoặc và thêm một "-".

private string ToCurrencyString(decimal amount) 
{ 
    string c = amount.ToString("C"); 
    if (c.StartsWith("(") && c.EndsWith(")")) 
    { 
     c = "-" + c.SubString(1, c.Length - 2); 
    } 
    return c; 
} 
+0

Đây không phải là cách để thay đổi điều này. Định dạng trong .NET Framework phụ thuộc vào văn hóa specif. –

+0

@WouterdeKort Bạn có thể giải thích lý do tại sao bạn cho rằng nó sẽ không hoạt động? OP là nhận thức về sự phụ thuộc văn hóa, nhưng rõ ràng sẽ giống như các dấu ngoặc bị loại bỏ và '-' được thêm vào, vậy làm thế nào nó không phải là một giải pháp? – Rotem

+0

Vì có nhiều giải pháp thanh lịch hơn. Nếu văn hóa được thay đổi thành một nền văn hóa không sử dụng() nhưng [], thì đột nhiên mã của bạn bị phá vỡ trong khi giải pháp của Tim Schmelter luôn hoạt động. –

Các vấn đề liên quan