无法从 Xamarin.Android 中的字符串中提取有符号的十进制数



我知道以前在这里问过类似的问题,但我没有找到任何适合我的东西,所以我很绝望。

我从蓝牙接收了许多用逗号分隔的值,并且我以字符串形式接收它们。它们可以是正十进制数或负十进制数。例如: 0, 1.11, 2.22, -3.33, -4.44, 55.55, 66.66, -77.77, 8.88, 0

但是,我无法按原样提取所有数字。我尝试过正则表达式,我尝试过拆分和解析,我尝试解析为十进制,双精度,但是每次我都会遇到 Parse 函数未经处理的异常。

感谢任何对最终解决方案的帮助。

编辑: 这是我尝试解析的代码部分:

public static void AddToGraphs(string list) {
try
{
var data = list.Split(',').Select(x => double.Parse(x, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture));
double[] dataArray = data.ToArray();
}
catch (Java.IO.IOException e)
{
Log.WriteLine(LogPriority.Error, e.Source, e.Message);
}
}

下面是应用崩溃时的调用堆栈:

0xFFFFFFFFFFFFFFFF in 
System.Diagnostics.Debugger.Mono_UnhandledException_internal    C#
0x1 in System.Diagnostics.Debugger.Mono_UnhandledException  C#
0x26 in object.6f90deee-2618-4e76-9135-3c21efb2de46 C#

0x96 in System.Number.ParseDouble   C#
0x3 in double.Parse C#
0xE in double.Parse C#
0x8 in Namespace.<>c.<AddToGraphs>b__38_0   C#
0x26 in System.Linq.Enumerable.SelectArrayIterator<string,double>.ToArray  C#
0x20 in System.Linq.Enumerable.ToArray<double>  C#
0x37 in Namespace.Page3Fragment.AddToGraphs C#
0x5A in Namespace.Page1Fragment.MyHandler.HandleMessage C#
0x11 in Android.OS.Handler.n_HandleMessage_Landroid_os_Message_ C#
0x17 in object.6f90deee-2618-4e76-9135-3c21efb2de46 C#

编辑: 这是日志猫,在应用程序崩溃之前记录了"list"变量:

Time    Device Name Type    PID Tag Message
07-31 00:55:30.097  Samsung SM-G610F    Info    32398   Test    0
07-31 00:55:30.157  Samsung SM-G610F    Info    32398   Test    , 1.11, 2.

编辑: 这是将接收到的数据发送到处理程序的蓝牙服务:

byte[] buffer = new byte[8192];
int bytes;
while (true)
{
bytes = ipStream.Read(buffer, 0, buffer.Length);
try
{
myService.myHandler.ObtainMessage(Page1Fragment.DATA_READ, bytes, -1, buffer).SendToTarget();
}
catch (Java.IO.IOException e)
{
throw e;
}
}

下面是接收并传递给 AddToGraphs 函数的处理程序的代码段:

private class MyHandler : Handler
{
Page1Fragment page1;
public MyHandler(Page1Fragment _page1)
{
page1 = _page1;
}
public override void HandleMessage(Message msg) 
{
byte[] readBuf = (byte[])msg.Obj;
string inData = Encoding.ASCII.GetString(readBuf, 0, msg.Arg1);
Page3Fragment.AddToGraphs(inData);
}
}

这应该可以解决问题:

var data = "0, 1.11, 2.22, -3.33, -4.44, 55.55, 66.66, -77.77, 8.88, 0";
var arr = Array.ConvertAll(data.Split(','), 
x => double.Parse(x,CultureInfo.InvariantCulture));

解析实数时应使用正确的区域性。查看此线程

至于你的任务,我会这样做:

var numbers = "0, 1.11, 2.22, -3.33, -4.44, 55.55, 66.66, -77.77, 8.88, 0"
.Split(new char [] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => double.Parse(x, CultureInfo.InvariantCulture)).ToArray();

编辑:

问题是信息不会一下子出现。因此,您需要创建一个缓冲区来存储数据,直到获得整个消息。

此外,如果您事先不知道消息的长度,则应将其作为消息的一部分发送,例如前 4 个字节 (Int32(。

相关内容

  • 没有找到相关文章