将指数数字串表示分为幂和指数

时间:2016-07-07 06:50:53

标签: c# string type-conversion

我有来自资源的字符串,如下所示:2⁴。我想知道是否有办法将其拆分为:

var base = 2; //or even "2", this is also helpful since it can be parsed

var exponent = 4;

我也在互联网上搜索了msdn Standard Numeric Format Strings,但我无法找到解决此案例的方法。

4 个答案:

答案 0 :(得分:3)

您可以在数字到上标数字之间添加映射,然后选择源中的所有数字(这将是base)和所有其他数字 - exponent

const string superscriptDigits = "⁰¹²³⁴⁵⁶⁷⁸⁹";
var digitToSuperscriptMapping = superscriptDigits.Select((c, i) => new { c, i })
                                .ToDictionary(item => item.c, item => item.i.ToString());

const string source = "23⁴⁴";

var baseString = new string(source.TakeWhile(char.IsDigit).ToArray());
var exponentString = string.Concat(source.SkipWhile(char.IsDigit).Select(c => digitToSuperscriptMapping[c]));

现在,您可以将baseexponent转换为int。 此外,您还需要在执行转换代码之前验证输入。

甚至没有映射:

var baseString = new string(source.TakeWhile(char.IsDigit).ToArray());
var exponentString = string.Concat(source.SkipWhile(char.IsDigit).Select(c => char.GetNumericValue(c).ToString()));

答案 1 :(得分:2)

您可以将正则表达式与String.Normalize一起使用:

var value = "42⁴³";
var match = Regex.Match(value, @"(?<base>\d+)(?<exponent>[⁰¹²³⁴-⁹]+)");

var @base = int.Parse(match.Groups["base"].Value);
var exponent = int.Parse(match.Groups["exponent"].Value.Normalize(NormalizationForm.FormKD));

Console.WriteLine($"base: {@base}, exponent: {exponent}");

答案 2 :(得分:1)

您的指数格式化方式在英语中称为上标。 如果您使用该关键字进行搜索,可以找到许多与此相关的问题。

上标中的数字以Unicode格式映射:

0 -> \u2070
1 -> \u00b9
2 -> \u00b2
3 -> \u00b3
4 -> \u2074
5 -> \u2075
6 -> \u2076
7 -> \u2077
8 -> \u2078
9 -> \u2079

您可以在字符串中搜索该值:

Lis<char> superscriptDigits = new List<char>(){ 
    '\u2070', \u00b9', \u00b2', \u00b3', \u2074', 
\u2075', \u2076', \u2077', \u2078', \u2079"};

//the rest of the string is the expontent. Join remaining chars.
str.SkipWhile( ch => !superscriptDigits.Contains(ch) ); 

你明白了

答案 3 :(得分:0)

你可以使用一个简单的正则表达式(如果你的源非常干净):

string value = "2⁴⁴";
string regex = @"(?<base>\d+)(?<exp>.*)";
var matches = Regex.Matches(value, regex);

int b;
int exp = 0;

int.TryParse(matches[0].Groups["base"].Value, out b);

foreach (char c in matches[0].Groups["exp"].Value)
{
    exp = exp * 10 + expToInt(c.ToString());
}

Console.Out.WriteLine("base is : {0}, exponent is {1}", b, exp);

expToInt(基于Unicode subscripts and superscripts):

public static int expToInt(string c)
{
    switch (c)
    {
        case "\u2070":
            return 0;
        case "\u00b9":
            return 1;
        case "\u00b2":
            return 2;
        case "\u00b3":
            return 3;
        case "\u2074":
            return 4;
        case "\u2075":
            return 5;
        case "\u2076":
            return 6;
        case "\u2077":
            return 7;
        case "\u2078":
            return 8;
        case "\u2079":
            return 9;
        default:
            throw new ArgumentOutOfRangeException();
    }
}

这将输出:

  

base是2,exp是44