2014-01-09 45 views
0

我需要檢查數學表達式是否包含指數值,然後用十進制值替換指數值。將指數值替換爲數學表達式中的雙倍

輸入: 「10993.657030812325 * 8.20681165367255E-05」

輸出: 「10993.657030812325 * 0.0000820681165367255」

的我面臨的複雜性是檢測它的數學表達式中。

檢測正則表達式我有正則表達式爲:

(([1-9][0-9]*\.?[0-9]*)|(\.[0-9]+))([Ee][+-]?[0-9]+)? 

然而,對於整個表達式匹配真實的,有沒有辦法解決這個直接的方法還是我必須打破它,並逐個檢查。

+2

爲什麼你會永遠使用正則表達式爲了這?無論如何,你可以使用正則表達式來匹配它,然後執行自定義代碼來轉換它。我相信.NET正則表達式庫有一個可以調用回調的替換函數。 – ThiefMaster

+0

@ThiefMaster:Enlighten請問,還有什麼可以做的呢,我也願意接受非正規表達式的解決方案 – Rauld

+0

@ThiefMaster我想看看它是否有效! (是的,你是對的,[它](http://msdn.microsoft.com/en-us/library/cft8645c.aspx)。) – Rawling

回答

0

提供,該指數是不是太大(小於99),您可以 使用此代碼:

String formula = "10993.657030812325*8.20681165367255E-05"; 
    String pattern = @"(([1-9][0-9]*\.?[0-9]*)|(\.[0-9]+))([Ee][+-]?[0-9]+)"; 

    // Let's change format of each double precision in the formula: 
    String result = Regex.Replace(formula, pattern, (match) => { 
    // Simple formating; may be you should use more elaborated one 
    Double db = Double.Parse(match.Value, CultureInfo.InvariantCulture); 
    // Now, you should format out the Double db: 
    // First eliminate exponent (F99 is the maximum possible; F100 won't do) 
    String St = db.ToString("F99", CultureInfo.InvariantCulture); 

    // Next eliminate trailing '0' 
    if (St.IndexOf('.') >= 0) 
     St = St.TrimEnd('0'); 

    return St.TrimEnd('.'); 
    }); 

結果是「10993.6570308123 * 0.0000820681165367255」

+0

我不會爲此使用'double'。例如,'31.0000000000000480 * 31.0000000000000480E-05'變爲'31.0000000000001 * 0.00031'。 – Rawling

+0

略有改善;現在它是'31.00000000000005 * 0.00031000000000000049'。此外'R99'中的'99'被[忽略](http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#RFormatString)。 – Rawling

+0

@Rawling:我明白了,你說得很對:爲了完成這項工作,我必須實現一個例程,它在字符串上進行格式化,而不是在Double上進行格式化 –