【问题标题】:Saving string decimal number to one element in string array将字符串十进制数保存到字符串数组中的一个元素
【发布时间】:2015-01-08 21:59:32
【问题描述】:

我在将十进制数从字符串保存到数组的一个元素时遇到问题。示例:我想将 String=" 5.2/2" 保存到字符串数组 [0]="5.2" [1]="2" 这里的问题是用户可以写数字之间的所有内容,程序将忽略它。 ..

这是我的储蓄号码计划。 现在它将 5.2 保存为 52...

static string[] saving_numbers(string string_undone)
{
  string[] String_array = new string[string_undone.Length];

  String_array[0] += string_undone[0];

  int Help_index = 0;
  for (int i = 1; i < string_undone.Length; i++)
  {
      if (string_undone[i] > 47 & string_undone[i] < 60)
      {
          if (string_undone[i-1] =='-' & Help_index==0)
          {
              Console.Write("Error: you gave us negative number which is not allowed!");
              Main();
              break;

          }
          if (string_undone[i - 1] < 46 | string_undone[i - 1] > 59 | string_undone[i - 1] == '/')
          {
              Help_index++;
              String_array[Help_index] += string_undone[i];

          }
          else
          {
              String_array[Help_index] += string_undone[i];
          }
      }
  }
  return String_array;
}

我的程序必须找到这个“4 ^ 7 / 2.5 * 3.1”的答案我不知道我是瞎还是傻但我根本解决不了这个小问题

我不能使用像 String.Split() 或 Char.IsDigit 这样的东西......我只能使用基本函数,用于处理单独的符号和可以返回字符串长度的函数我可以使用 Convert.ToDouble我后来用它来将字符串元素转换成双精度

【问题讨论】:

  • 解析表达式并不是那么小事
  • 我不久前写了一个数学表达式解析器,如果你现在需要它:codeproject.com/Articles/274093/Math-Parser-NET
  • 我不能使用任何库或任何东西...我只能使用基本的 .Net 函数 稍后将这些字符串数字或元素转换为可以使用的 Convert.ToDouble 的双精度数。
  • 如果不是功课,不妨使用this
  • @Mike -- 你可以随时查看我的源代码,看看我是如何做到的,这样你就可以得到一些想法

标签: c# arrays string numbers decimal


【解决方案1】:

我认为以下 .NET Framework 属性和方法可能会对您有所帮助:

如果您想采用更高级的方法来破译您的输入字符串,您可以使用RegEx class 将您的输入字符串分割成可处理的组件(实际上是数字和运算符)。

这项任务并不是那么简单,并且可能通过对有问题的输入字符串进行一些假设来简化。一个重要的假设可能是:

  • 数字和运算符之间必须是空格。

那么你可以这样开始:

// Get the individual elements
String[] components = string_undone.Split(" ");

// Now detect all available decimals...
List<Decimal> decimals = new List<Decimal>;
Decimal number = null;
foreach(String s in components)
{
  if(Decimal.TryParse(s, out number)
    decimals.Add(number);
}

希望这对您有所帮助并让您朝着正确的方向前进。

【讨论】:

  • 我不能使用像 String.Split() 或 Char.IsDigit 这样的东西......我只能使用基本函数,用于处理单独的符号和可以返回字符串长度的函数和我可以使用 Convert.ToDouble 我稍后将其用于将字符串元素转换为双精度
  • 为什么不能用那些东西?
【解决方案2】:

这是需要正则表达式的地方之一:

var reg = new Regex(@"\s*([0-9.]+).([0-9.]+)");
var match = reg.Match(" 5.2/2");
var first = match.Groups[1].Value;  // = "5.2"
var second = match.Groups[2].Value;     // = "2"

我也用“123.4+56”和“3;5.6”测试过

【讨论】:

    【解决方案3】:

    你能检查你的字符串吗:

    string str; str.Contains('.'); 通过“包含”检查您是否有“。”或“/”或其他任何东西

    str.Split('.');

    通过“拆分”在数组中保留字符之间的数字并保存。

    在操作中注意优先级,通过switch case检查,你自己根据优先级给它们加上括号。

    【讨论】:

      【解决方案4】:

      你没有写小数,因为 ascii 值为 46。

      if (string_undone[i] > 47 & string_undone[i] < 60)
          ...
      

      因为它小于您的范围,所以永远不会输入 if 语句并且小数位不会写入您的字符串。

      【讨论】:

      • 是的,我现在看到了,我正在努力解决这个问题,但到目前为止它对我不起作用。感谢您指出这一点。
      • @Mike BTW,您在代码中使用了二元运算符。它的工作方式与您期望的布尔比较一样,但我相信您的意思是使用逻辑比较运算符 && 和 ||。
      猜你喜欢
      • 2020-04-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 2013-10-13
      • 2015-07-13
      相关资源
      最近更新 更多