2012-12-16 47 views
15

Tương tự như this question chỉ trong C# thay vì JavaScript. Tôi không thể tìm thấy bất kỳ điều gì cho C# khi tìm kiếmChuyển đổi một phần văn bản thành số thập phân

Tôi có một hộp văn bản sẽ lấy số lượng, sau đó được lưu trữ dưới dạng gấp đôi trong cơ sở dữ liệu. Tuy nhiên, có thể một số đại lượng sẽ được nhập dưới dạng phân số chuỗi, ví dụ 1/2 cho 0.5. Tôi muốn để có thể chuyển đổi những số thập phân trước khi lưu trữ chúng vào cơ sở dữ liệu (có thể cũng chuyển đổi trở lại sẽ được tốt đẹp nhưng không cần thiết). Tôi muốn có thể xử lý cả số thập phân và số hỗn hợp, ví dụ: 2 1/2 được lưu dưới dạng 2.5

Bất kỳ ai biết cách thực hiện việc này?

+0

Tôi muốn chia nhỏ nó vào thư viện phân tích cú pháp tìm kiếm các điểm tương đồng như dấu cách, '/' và v.v. với 'Int32.Parse' và trả về kết quả. –

+0

http://www.codeproject.com/Articles/9078/Fraction-class-in-C –

Trả lời

11

Hãy thử tách nó trên không gian và dấu gạch chéo, một cái gì đó như:

double FractionToDouble(string fraction) { 
    double result; 

    if(double.TryParse(fraction, out result)) { 
     return result; 
    } 

    string[] split = fraction.Split(new char[] { ' ', '/' }); 

    if(split.Length == 2 || split.Length == 3) { 
     int a, b; 

     if(int.TryParse(split[0], out a) && int.TryParse(split[1], out b)) { 
      if(split.Length == 2) { 
       return (double)a/b; 
      } 

      int c; 

      if(int.TryParse(split[2], out c)) { 
       return a + (double)b/c; 
      } 
     } 
    } 

    throw new FormatException("Not a valid fraction."); 
} 

Hey, it worked! Hãy nhớ kiểm tra cho một phép chia cho không, quá. Bạn sẽ nhận được kết quả Infinity, -Infinity hoặc NaN.

+1

Cảm ơn bạn rất nhiều! Chỉ cần thực hiện điều này vào ứng dụng của tôi và nó hoạt động hoàn hảo. –

+0

Tại sao chúng ta cần sử dụng dấu phân cách '' (dấu cách)? @ U2744 SNOWFLAKE –

+0

Cũng không chỉ đơn giản là sử dụng các công việc sau đây? nó xuất ra chính xác. đúp frac = (double) 1/8; –

1

Tách chuỗi trên "/" rồi chia hai số.

public float FractionToDecimal(String input) 
{ 
    String[] fraction = input.Split(new[] { "/" }, StringSplitOptions.RemoveEmptyEntries); 
    if (fraction.Length != 2) 
    { 
     throw new ArgumentOutOfRangeException(); 
    } 
    Int32 numerator, denominator; 
    if (Int32.TryParse(fraction[0], out numerator) && Int32.TryParse(fraction[1], out denominator)) 
    { 
     if (denominator == 0) 
     { 
      throw new InvalidOperationException("Divide by 0 occurred"); 
     } 
     return (float)numerator/denominator; 
    } 
    throw new ArgumentException(); 
} 
7

Và đây vẫn chưa có một giải pháp hơn, nhưng với một chút hơn seamless an integration:

public class FractionalNumber 
{ 
    public Double Result 
    { 
     get { return this.result; } 
     private set { this.result = value; } 
    } 
    private Double result; 

    public FractionalNumber(String input) 
    { 
     this.Result = this.Parse(input); 
    } 

    private Double Parse(String input) 
    { 
     input = (input ?? String.Empty).Trim(); 
     if (String.IsNullOrEmpty(input)) 
     { 
      throw new ArgumentNullException("input"); 
     } 

     // standard decimal number (e.g. 1.125) 
     if (input.IndexOf('.') != -1 || (input.IndexOf(' ') == -1 && input.IndexOf('/') == -1 && input.IndexOf('\\') == -1)) 
     { 
      Double result; 
      if (Double.TryParse(input, out result)) 
      { 
       return result; 
      } 
     } 

     String[] parts = input.Split(new[] { ' ', '/', '\\' }, StringSplitOptions.RemoveEmptyEntries); 

     // stand-off fractional (e.g. 7/8) 
     if (input.IndexOf(' ') == -1 && parts.Length == 2) 
     { 
      Double num, den; 
      if (Double.TryParse(parts[0], out num) && Double.TryParse(parts[1], out den)) 
      { 
       return num/den; 
      } 
     } 

     // Number and fraction (e.g. 2 1/2) 
     if (parts.Length == 3) 
     { 
      Double whole, num, den; 
      if (Double.TryParse(parts[0], out whole) && Double.TryParse(parts[1], out num) && Double.TryParse(parts[2], out den)) 
      { 
       return whole + (num/den); 
      } 
     } 

     // Bogus/unable to parse 
     return Double.NaN; 
    } 

    public override string ToString() 
    { 
     return this.Result.ToString(); 
    } 

    public static implicit operator Double(FractionalNumber number) 
    { 
     return number.Result; 
    } 
} 

Và bởi vì nó thực hiện các hành tiềm ẩn, nó có thể được sử dụng đơn giản bằng cách:

Double number = new FractionalNumber("3 1/2"); 

Bất cứ thứ gì không thể phân tích cú pháp trả về hằng số Đôi Double.NaN. Nếu không nhận được một danh sách các đầu vào có thể giặt, điều này đã làm việc với một số vấn đề cơ bản. Vui lòng tinh chỉnh lớp học để phù hợp với nhu cầu của bạn.

-2
decimal re = (decimal)1/7; 

hoạt động cho tôi.

+0

Trình biên dịch có thể thực hiện điều này bởi vì các trình biên dịch này là các chữ số, và các biểu thức toán học là '/'. '(thập phân)" 1/7 "' sẽ thất bại thảm hại. – BradleyDotNET

+0

Đúng vậy. Tôi chỉ bỏ qua "văn bản" trong phần văn bản, tôi xin lỗi. Chạy chức năng "fractiontodouble" của một người dùng khác, trước tiên, nhưng thay đổi nó để nó có tính fractio. –

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