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.
Nguồn
2012-12-16 17:58:48
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ả. –
http://www.codeproject.com/Articles/9078/Fraction-class-in-C –