2010-08-04 56 views
7

Tôi đang làm việc trên một ứng dụng C#. Tôi muốn thay đổi số thập phân số bằng dấu phẩy (,), nơi tôi có dấu chấm (.) Sử dụng cụm từ thông dụng.Thay dấu chấm (.) Bằng dấu phẩy (,) bằng RegEx?

Ví dụ:

Price= 100,00.56 

Như quy tắc quốc tế này đại diện cho các giá trị số nhưng tôi Thụy Điển họ có những cách khác nhau cho số Giống như

Price= 100.00,56 

Vì vậy, tôi muốn thay đổi dấu chấm thành dấu phẩy (.) (,) và dấu phẩy (,) vào dấu chấm (.) bằng RegEx. Có thể hướng dẫn tôi về điều này.

Trả lời

23

Khi định dạng số, bạn nên sử dụng string format overload mà phải mất một đối tượng CultureInfo. Tên văn hóa cho tiếng Thụy Điển là "sv-SE", có thể được nhìn thấy here.

decimal value = -16325.62m; 
Console.WriteLine(value.ToString(CultureInfo.CreateSpecificCulture("sv-SE"))); 

Sửa:

Như @OregonGhost chỉ ra - phân tích ra số cũng nên được thực hiện với CultureInfo.

+0

+1 ảo, thật đáng tiếc tôi đã bỏ phiếu hôm nay. Nhưng biết bạn kiếm được nó. :) – sarnold

+0

tâm trí tuyệt vời .. chụp +1 :-) –

+3

+1 cho giải pháp kinh điển. Tuy nhiên, điều quan trọng cần lưu ý là đây không chỉ là giải pháp cho * định dạng * mà còn cho các số * phân tích cú pháp *. – OregonGhost

4

Bạn có thể thực hiện việc này ngay cả khi không có regex. Ví dụ

var temp = price.Replace(".", "<TEMP>"); 
var temp2 = temp.Replace(",", "."); 
var replaced = temp2.Replace("<TEMP>", ","); 
4

Không chắc chắn 100,00,56 đại diện, ý của bạn là 10.000,56?
Để trả lời câu hỏi của bạn:

Đối với một nhiệm vụ đơn giản như vậy, tại sao lại sử dụng RegEx? Bạn có thể làm điều đó dễ dàng hơn nhiều:

string oldValue = "100,00.56"; 
char dummyChar = '&'; //here put a char that you know won't appear in the strings 
var newValue = oldValue.Replace('.', dummyChar) 
         .Replace(',', '.') 
         .Replace(dummyChar, ','); 

Sửa Tôi đồng ý với @Oded, cho số định dạng sử dụng lớp CultureInfo.

+0

'100,00.56' là một biểu diễn bằng tiếng Anh, '10.000,56' - Thụy Điển/Nga/etc – abatishchev

+1

@abati: Tôi nghĩ anh ấy đang nói về thực tế rằng các ví dụ của OP chỉ có hai chữ số giữa dấu tách hàng nghìn và dấu tách thập phân. Nó có lẽ chỉ là một lỗi đánh máy. –

+0

@Alan: Bạn nói đúng, không được đề cập ngay lập tức – abatishchev

5

Cũng có một cái nhìn tại

System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator 
3

Đừng dựa vào RegExp cho loại điều :) Sử dụng xây dựng trong các nền văn hóa fx:

decimal s = decimal.Parse("10,000.56", NumberStyles.Currency, CultureInfo.GetCultureInfo("en-US")); 
string output = s.ToString("N",CultureInfo.GetCultureInfo("da-DK")); 

en-US sẽ phân tích nó một cách chính xác và da-DK sử dụng loại biểu diễn khác. Tôi sống trong DK và do đó sử dụng nhưng bạn nên sử dụng văn hóa phù hợp với đầu ra của bạn.

4

Không phải là một giải pháp RegEx nhưng từ kinh nghiệm của tôi - chính xác hơn:

public static string CheckDecimalDigitsDelimiter(this string instance) 
{ 
    var sv = new CultureInfo("sv-SE"); 
    var en = new CultureInfo("en-US"); 

    decimal d; 
    return (!Decimal.TryParse(instance, NumberStyles.Currency, sv, out d) && 
      Decimal.TryParse(instance, NumberStyles.Currency, en, out d)) ? 
     d.ToString(sv) : // didn't passed by SV but did by EN 
     instance; 
} 

không phương pháp này làm gì? Nó đảm bảo rằng nếu chuỗi được cung cấp không đúng chuỗi Thụy Điển nhưng là tiếng Anh chính xác - chuyển đổi nó sang Thụy Điển, ví dụ: 100,00 -> 100,00 nhưng 100.00 -> 100,00.

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