2017-07-26 53 views
5

Tôi đang cố gắng lấy đầu vào của người dùng, phân tích cú pháp và sau đó hiển thị với String.Format(), định dạng hàng nghìn lần bằng dấu phẩy.C# Chuyển đổi chuỗi thành gấp đôi/số thập phân và quay lại chuỗi, giữ dấu 0, thêm dấu phẩy cho hàng nghìn

So, if user provides 
1000 I will display 1,000 
1000.00 => 1,000.00 
1000.0 => 1,000.0 
1,000.5 => 1,000.5 

Về cơ bản tôi muốn giữ lại tất cả các số thập phân (kể cả zero trailing) đã được cung cấp và chỉ cần thêm định dạng cho hàng ngàn. tôi đã cố gắng:

String.Format("{0:#,0.######}" , Decimal.Parse(input)); 
String.Format("{0:#,0.######}" , Double.Parse(input); 

Trả lời

7

double.Parse(input) là một đi không, như double không theo dõi các số thập phân.

decimal.Parse(input).ToString() sẽ cho biết rằng decimal sẽ theo dõi điều đó. Thật không may, decimal.Parse(input).ToString() sử dụng độ chính xác này và không sử dụng dấu tách hàng nghìn và decimal.Parse(input).ToString("N") bỏ qua độ chính xác nhưng không sử dụng dấu tách hàng nghìn.

tay chiết xuất chính xác từ thập phân làm việc mặc dù, và cho phép bạn xây dựng các chuỗi định dạng chính xác:

static string InsertThousandsSeparator(string input) { 
    var dec = decimal.Parse(input); 
    var bits = decimal.GetBits(dec); 
    var prec = bits[3] >> 16 & 255; 
    return dec.ToString("N" + prec); 
} 

này được dựa trên the layout of decimal as described on MSDN:

Bits 16-23 phải chứa một số mũ trong khoảng từ 0 đến 28, biểu thị lũy thừa của 10 để chia số nguyên.

See it working on .NET Fiddle. (biếu không của @Alisson)

+0

Đó là tất cả, tất cả các trường hợp thử nghiệm đều được thông qua (tôi đã tự kiểm tra). Giải pháp tốt đẹp và sạch sẽ. – Alisson

+0

Tuyệt vời. Cảm ơn rất nhiều. Tôi đã nghĩ rằng tôi sẽ cần phải viết một số Regex, mà tôi thực sự muốn tránh. – Razkar

-1

Nếu bạn không nhớ năm 1000 chuyển đổi sang 1,000.00 thì sau đây là tốt nhất vì nó coi locale của người dùng quá.

string output = String.Format("{0:n}", input); 

Nếu bạn muốn 1000 chuyển thành chỉ 1.000, sau đó bạn có thể sử dụng như sau:

string output2 = String.Format("{0:#,##0.##}", input); 
+0

"Nếu bạn không nhớ 1000 chuyển đổi thành 1.000.00" - Nếu bạn không nhớ bỏ qua những gì trong câu hỏi, bất kỳ câu trả lời nào hoạt động, nhưng câu hỏi cụ thể bao gồm điều này. – hvd

+0

Đây không phải là những gì OP yêu cầu. Họ muốn giữ cùng số lượng chữ số thập phân. – Alisson

+0

Đồng ý, câu trả lời không đúng nếu không đọc đúng câu hỏi. Lỗi của tôi. – Sach

0

Bạn có thể sử dụng regex cho việc này:

var input = "1000.50000"; 
var regex = new Regex("^(?<int>-?[\\d,]+)\\.(?<fract>\\d+)$"); 
var match = regex.Match(input); 
var integralPart = match.Groups["int"].Value.Replace(",", ""); 
var fractionalPart = match.Groups["fract"].Value; 
var result = $"{decimal.Parse(integralPart):n0}.{fractionalPart}"; 
0
 public string DoFormat(string num) 
    { 
     int pt = num.IndexOf("."); 
     if (pt > 0) 
     { 
      return string.Format("{0:#,##0}", num.Substring(0, pt)) + num.Substring(pt, num.Length - pt); 
     } 
     else 
     { 
      return string.Format("{0:#,##0}", num); 
     } 
    } 

này tách chuỗi tại dấu thập phân và trả về bất cứ điều gì là sau dấu thập phân như đã được gõ trong các định dạng BUT phần nguyên của số bằng dấu phẩy.

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