如何用逗号和8位

时间:2018-03-29 10:57:08

标签: c# string

我想将一个长字符串(仅包含数字)拆分为字符串arr 0f,逗号后面有8位数字。

例如:

输入:

string str = "45.00019821162.206580920.032150970.03215097244.0031982274.245303020.014716900.046867870.000198351974.613444580.391664580.438532450.00020199 3499.19734739 0.706802871.145335320.000202002543.362378010.513759201.659094520.000202102.391733720.000483371.65957789"

输出:

string[] Arr=
" 
45.00019821 162.20658092 234.03215097 123123.03215097
255.00019822 74.24530302 23422.01471690 1.04686787
12.00019835 1974.61344458 234.39166458 123212.43853245
532.00020199 3499.19734739 878.70680287 1.14533532
1234.00020200 2543.36237801 23.51375920 1.65909452
12221.00020210 2.39173372 0.00048337 1.65957789"

编辑:

我尝试使用

String.Format("{0:0.00000000}", str); 

或某些SubString,例如:

public static string GetSubstring(string input, int count, char delimiter) 
{ 
    return string.Join(delimiter.ToString(), input.Split(delimiter).Take(count)); 
} 

没有成功。

4 个答案:

答案 0 :(得分:4)

您可以使用Regex分割字符串:

var strRegex = @"(?<num>\d+\.\d{8})";
var myRegex = new Regex(strRegex, RegexOptions.None);

foreach (Match myMatch in myRegex.Matches(str))
{
    var part = myMatch.Groups["num"].Value;

    // convert 'part' to double and store it wherever you want...
}

更紧凑的版本:

var myRegex = new Regex(@"(?<num>\d*\.\d{8})", RegexOptions.None);

var myNumbers = myRegex.Matches(str).Cast<Match>()
      .Select(m => m.Groups["num"].Value)
      .Select(v => Convert.ToDouble(v, CultureInfo.InvariantCulture));

答案 1 :(得分:1)

这将是它的经典for循环版本(不涉及魔法):

// split by separator 
string[] allparts = str.Split('.');
// Container for the resulting numbers
List<string> numbers = new List<string>();
// Handle the first number separately
string start = allparts[0];
string decimalPart ="";

for (int i = 1; i < allparts.Length; i++)
{       
    decimalPart = allparts[i].Substring(0, 8);
    numbers.Add(start + "." + decimalPart);
    // overwrite the start with the next number
    start = allparts[i].Substring(8, allparts[i].Length - 8);
}

编辑:

这将是一个产生相同结果的LINQ版本:

// split by separator 
string[] allparts = str.Split('.');

IEnumerable<string> allInteger = allparts.Select(x => x.Length > 8 ? x.Substring(8, x.Length - 8) : x);
IEnumerable<string> allDecimals = allparts.Skip(1).Select(x => x.Substring(0,8));

string [] allWholeNumbers = allInteger.Zip(allDecimals, (i, d) => i + "." + d).ToArray();

答案 2 :(得分:1)

输入字符串str可以转换为所需的输出,如下所示。

static IEnumerable<string> NumberParts(string iString)
 {
     IEnumerable<char> iSeq = iString;
     while (iSeq.Count() > 0)
     {
         var Result = new String(iSeq.TakeWhile(Char.IsDigit).ToArray());
         iSeq = iSeq.SkipWhile(Char.IsDigit);
         Result += new String(iSeq.Take(1).ToArray());
         iSeq = iSeq.Skip(1);
         Result += new String(iSeq.Take(8).ToArray());
         iSeq = iSeq.Skip(8);
         yield return Result;
     }
 }

上面的解析方法可以如下调用。

var Parts = NumberParts(str).ToArray();
var Result = String.Join(" ", Parts);

答案 3 :(得分:0)

没有正则表达式的最短路:

var splitted = ("00000000" + str.Replace(" ", "")).Split('.');

var result = splitted 
    .Zip(splitted.Skip(1), (f, s) => 
        string.Concat(f.Skip(8).Concat(".").Concat(s.Take(8))))
    .ToList()

Try it online!