2010-10-06 45 views
12

Tôi có một phương pháp mà trả về số như thế này:Dấu tách thập phân C#?

public decimal GetNumber() 
{ 
    return 250.00m; 
} 

Bây giờ khi giá trị này được in ra cửa sổ Console ví dụ, nó có một dấu phẩy (250,00) thay vì một điểm (250,00). Tôi luôn muốn có một điểm ở đây, tôi đang làm gì sai?

+6

Nếu bạn không nhận thức: ',' ​​được sử dụng làm dấu tách thập phân ở nhiều quốc gia châu Âu, như Đức, Pháp và Ý. Có lẽ bạn đã đặt văn hóa của mình thành một trong những nơi này? –

+0

Tôi đã thử nghiệm chức năng này trong một ứng dụng giao diện điều khiển và hoạt động ok cho tôi. Được hiển thị với điểm (250.00). –

Trả lời

48

decimal chính nó không có định dạng - nó không có dấu phẩy hay dấu chấm.

Đó là khi bạn chuyển đổi nó thành chuỗi mà bạn sẽ nhận được điều đó. Bạn có thể chắc chắn rằng bạn sẽ có được một dấu chấm bằng cách xác định văn hóa bất biến:

using System; 
using System.Globalization; 
using System.Threading; 

class Test 
{ 
    static void Main() 
    { 
     Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR"); 
     decimal d = 5.50m; 
     string withComma = d.ToString(); 
     string withDot = d.ToString(CultureInfo.InvariantCulture); 
     Console.WriteLine(withComma); 
     Console.WriteLine(withDot); 
    } 
} 
+1

System.Globalization.CultureInfo germanCultureInfo = new System.Globalization.CultureInfo ("de-DE"); số thập phân d = 0,3m; chuỗi s1 = d.ToString (germanCultureInfo); -> s1 là 0,3 không 0,3. Tại sao? – Offler

+1

@Offler: Tôi không thể sao chép điều đó - mã * chính xác * đó mang lại cho tôi "0,3". –

+1

Đã xảy ra ở máy khách hàng. Đã được tìm kiếm trên Internet để tìm hiểu lý do tại sao ... Giải pháp bây giờ được tìm thấy tại khách hàng pc - Cài đặt Windows nơi thay đổi. – Offler

1

Định dạng theo ngôn ngữ cụ thể?

http://en.wikipedia.org/wiki/File:DecimalSeparator.svg (Xanh bằng dấu phẩy, vì vậy nếu bạn đang gọi ToString() trên số thập phân của bạn bằng thông tin văn hóa của bất kỳ vị trí nào trong số này, bạn sẽ thấy dấu phẩy).

6

Theo giải thích của Jon Skeet, bạn nên xác định văn hóa sử dụng để định dạng string:

var str = GetNumber().ToString(System.Globalization.CultureInfo.InvariantCulture); 

Đó là một thói quen tốt luôn sử dụng quá tải ToString mà bạn chỉ định văn hóa. Nếu không, .NET sử dụng các chủ đề hiện tại Culture, mà sẽ viết khác nhau strings để đầu ra theo quy định của địa phương trong những PC ...

+1

... mặt khác nó cũng có thể là sử dụng hiện tại locale trên PC (cho rằng chúng ta không nói ứng dụng web) là hành vi ưu tiên. Rằng sau khi tất cả sẽ là những gì người dùng được sử dụng để nhìn thấy. –

+2

Có, tôi đồng ý với bạn. Đó là một hành vi hợp lệ khi chuỗi sẽ được sử dụng trong giao diện người dùng. Nhưng nó có thể là một vấn đề thực sự khi chuỗi được sử dụng để thực hiện một số loại serialization.Trong trường hợp này, việc deserialization có thể thất bại tùy thuộc vào miền địa phương PC thực thi ... Và bạn sẽ không thấy điều này trước khi sản phẩm được vận chuyển trên một nền tảng với một miền địa phương khác. Tôi muốn dành một vài giây để suy nghĩ về nó (và có một quyết định hợp lý về nó) hơn là hối hận sau này. – Eilistraee

0

Tôi đã kiểm tra nó với visual studio 2008 (giao diện điều khiển ứng dụng) và nó không hiển thị "" thay vì "." , vui lòng cung cấp thêm chi tiết. Tôi nghĩ vấn đề về văn hóa - thông tin của nó. vui lòng cung cấp thêm một số chi tiết về mã số

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.Write(GetNumber()); 
    } 
    public static decimal GetNumber() 
    { 
     return 250.00m; 
    } 

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