我有来自资源的字符串,如下所示:2⁴
。我想知道是否有办法将其拆分为:
var base = 2; //or even "2", this is also helpful since it can be parsed
和
var exponent = 4;
我也在互联网上搜索了msdn Standard Numeric Format Strings,但我无法找到解决此案例的方法。
答案 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]));
现在,您可以将base
和exponent
转换为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