與僅用C#代替JavaScript的this question類似。我在搜索時找不到任何用於C#的內容將文本分數轉換爲小數
我有一個文本框,它將獲取一個數量,稍後將其作爲double存儲在數據庫中。然而,有些數量可能會以字符串分數的形式輸入,例如1/2爲0.5。 我希望能夠將它們轉換爲十進制,然後將它們存儲到數據庫(也可以轉換回來會很好,但不是必需的)。我希望能夠處理分數和混合數字,例如2 1/2保存爲2.5
任何人都知道這樣做的方式?
與僅用C#代替JavaScript的this question類似。我在搜索時找不到任何用於C#的內容將文本分數轉換爲小數
我有一個文本框,它將獲取一個數量,稍後將其作爲double存儲在數據庫中。然而,有些數量可能會以字符串分數的形式輸入,例如1/2爲0.5。 我希望能夠將它們轉換爲十進制,然後將它們存儲到數據庫(也可以轉換回來會很好,但不是必需的)。我希望能夠處理分數和混合數字,例如2 1/2保存爲2.5
任何人都知道這樣做的方式?
嘗試分裂它的空間和斜線,是這樣的:
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!記得零來檢查師,太。作爲結果,您將獲得Infinity,-Infinity或NaN。
非常感謝!只是將其實施到我的應用程序,它完美的作品。 –
爲什麼我們需要使用分隔符''(空格)? @ U2744 SNOWFLAKE –
還不只是使用下面的線條工作?它輸出正確。 雙壓裂=(雙)1/8; –
將字符串拆分爲「/」,然後除以兩個數字。
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();
}
而且這裏又是一個多解決方案,但有一點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;
}
}
而且因爲它實現了隱含的運營商,它可以簡單地通過使用:
Double number = new FractionalNumber("3 1/2");
凡是無法解析返回Double常量Double.NaN
。沒有深入到可能的投入清單,這與一些基礎知識。隨意調整課程,以適應您的需求。
您可以嘗試這樣的事:http://csharpeval.codeplex.com/或本:https://github.com/Giorgi/Math-Expression-Evaluator
這兩個庫是用C#編寫完整的數學表達式求值。他們可能是爲了你的用例而過度使用,但值得一提的是爲了別人的利益。
decimal re = (decimal)1/7;
適合我。
編譯器可以這樣做,因爲它們是數字文字,'/'形成數學表達式。 '(十進制)「1/7」'將慘敗。 – BradleyDotNET
的確如此。我只是在文本分數中忽略了「文本」,我很抱歉。首先,由其他用戶運行函數「fractiontodouble」,但首先修改它,以使其成爲小數點。 –
我會把它分解到一個解析庫,它用'Int32.Parse'查找空間,'/'等的共同點並返回結果。 –
http://www.codeproject.com/Articles/9078/Fraction-class-in-C –