2010-06-28 34 views
35

Tôi muốn thay đổi dấu thập phân sang một ký tự khác trong C#. Tôi có một double biến valueLàm thế nào để thay đổi biểu tượng cho dấu thập phân trong double.ToString()?

double value; 

và khi tôi sử dụng lệnh:

Console.WriteLine(value.ToString()); // output is 1,25 

Tôi biết tôi có thể làm điều này:

Console.WriteLine(value.ToString(
    CultureInfo.CreateSpecificCulture("en-GB"))); // output is 1.25 

nhưng tôi không thích nó rất nhiều bởi vì nó rất dài và tôi cần nó khá thường xuyên trong chương trình của tôi.

Có phiên bản ngắn hơn để đặt "dấu thập phân" thực sự là điểm và không phải dấu phẩy như trong văn hóa của tôi không?

Trả lời

77

Một số phím tắt là tạo lớp NumberFormatInfo, đặt thuộc tính NumberDecimalSeparator thành "." và sử dụng lớp làm tham số cho phương thức ToString() bất cứ khi nào bạn cần nó.

NumberFormatInfo nfi = new NumberFormatInfo(); 
nfi.NumberDecimalSeparator = "."; 

value.ToString(nfi); 
+2

Tôi thích phương pháp này nhiều hơn vì ngôn ngữ của nó độc lập! –

15

Có lẽ tôi hiểu nhầm ý định của câu hỏi của bạn, vì vậy sửa tôi nếu tôi sai, nhưng bạn không thể áp dụng các cài đặt văn hóa trên toàn cầu một lần, và sau đó không lo lắng về việc tùy chỉnh mọi câu lệnh viết?

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB"); 
+0

Vâng, tôi không cần nó trong toàn bộ chương trình tôi cần nó để phù hợp với định dạng của PathGeometry trong WPF nơi các dấu thập phân được mong đợi. Nhưng nó chỉ ra rằng giải pháp này không làm tổn thương bất cứ điều gì khác. Cảm ơn bạn! –

+0

@womp Bằng cách trả lời tốt hơn nhiều! Điều này cũng áp dụng cho tiểu chủ đề nếu tôi đặt nó vào chủ đề chính của tôi? Tôi muốn áp dụng thiết lập này cho toàn bộ thời gian thực hiện lắp ráp của tôi. – Bitterblue

32

Tạo phương pháp mở rộng?

Console.WriteLine(value.ToGBString()); 

// ... 

public static class DoubleExtensions 
{ 
    public static string ToGBString(this double value) 
    { 
     return value.ToString(CultureInfo.GetCultureInfo("en-GB")); 
    } 
} 
+0

Có thể một người nào đó bị downvoted bởi vì, trong khi điều này làm việc như một sự quyến rũ, nó có thể được thực hiện một cách đẹp hơn, bằng cách thiết lập cultureinfo toàn cầu. Btw. Tôi không phải là người đi xuống.:) –

+1

@Thomas: Thật vậy, mặc dù khi OP nói * "Tôi cần nó khá thường xuyên trong chương trình của tôi" *, tôi giải thích điều này có nghĩa là một cái gì đó như * "thường nhưng không phải mọi lần" *. – LukeH

14

Bạn có thể thay đổi dấu phân cách thập phân bằng cách thay đổi văn hóa được sử dụng để hiển thị số. Tuy nhiên, hãy coi chừng điều này sẽ thay đổi mọi thứ khác về số (ví dụ: phân tách nhóm, kích thước nhóm, số chữ số thập phân). Từ câu hỏi của bạn, có vẻ như bạn đang đặt mặc định cho một nền văn hóa sử dụng dấu phẩy làm dấu phân cách thập phân.

Để thay đổi chỉ dấu tách thập phân mà không thay đổi văn hóa, bạn có thể sửa đổi thuộc tính NumberDecimalSeparator của văn bản hiện tại NumberFormatInfo.

Thread.CurrentCulture.NumberFormat.NumberDecimalSeparator = "."; 

Điều này sẽ sửa đổi văn hóa hiện tại của luồng. Tất cả đầu ra bây giờ sẽ được thay đổi, có nghĩa là bạn chỉ có thể sử dụng value.ToString() để xuất ra định dạng mà bạn muốn, mà không phải lo lắng về việc thay đổi văn hóa mỗi khi bạn xuất một số.

(Lưu ý rằng một nền văn hóa neutral không thể đã tách thập phân của nó thay đổi.)

+5

Nếu bạn cố gắng làm điều đó, bạn sẽ gặp lỗi "Ví dụ là chỉ đọc". –

+0

@MariusStanescu Tôi nghĩ rằng điều này chỉ xảy ra khi sử dụng một nền văn hóa nuetral như adrianbanks lưu ý ở phần cuối của câu trả lời của mình. – patrickbadley

+0

@patrickbadley Tôi vừa thử giải pháp này và gặp lỗi "chỉ đọc". Thêm "Culture.IsNeutralCulture" trong "cửa sổ xem" rõ ràng cho thấy rằng văn hóa không trung tính. Tuy nhiên, tôi cũng nhận thấy rằng đó là chỉ đọc. Nhân bản văn hóa dường như là cách phù hợp với điều này. Xem [answer] sau (http://stackoverflow.com/a/3912937/4625305). – AXMIM

1

Nếu bạn có một ứng dụng web Asp.Net, bạn cũng có thể thiết lập nó trong web.config để nó là như nhau trong suốt toàn bộ ứng dụng web

<system.web> 
    ... 
    <globalization 
     requestEncoding="utf-8" 
     responseEncoding="utf-8" 
     culture="en-GB" 
     uiCulture="en-GB" 
     enableClientBasedCulture="false"/> 
    ... 
</system.web> 
Các vấn đề liên quan