(Java+;Android)解析字符串以浮动奇怪错误
这听起来可能是个微不足道的问题,但我真的很难弄明白。基本上,我正在将一个字符串从我的Android发送到我的PC。所有连接都正常,字符串传输成功。这是Android代码(向计算机发送字符串): 如果rotZ是我想要发送的,它是一个“float”值。我需要将“\n”放在邮件的末尾,以便在PC上识别为完整邮件。到目前为止,一切正常。现在我想在我的电脑上阅读这篇文章,这是通过以下方式实现的:(Java+;Android)解析字符串以浮动奇怪错误,java,android,string,parsing,Java,Android,String,Parsing,这听起来可能是个微不足道的问题,但我真的很难弄明白。基本上,我正在将一个字符串从我的Android发送到我的PC。所有连接都正常,字符串传输成功。这是Android代码(向计算机发送字符串): 如果rotZ是我想要发送的,它是一个“float”值。我需要将“\n”放在邮件的末尾,以便在PC上识别为完整邮件。到目前为止,一切正常。现在我想在我的电脑上阅读这篇文章,这是通过以下方式实现的: //BlueTooth String lineRead = ""; try { lin
//BlueTooth
String lineRead = "";
try
{
lineRead = new String(sampleSPPServer.readFromDevice());
if(lineRead != null && !lineRead.isEmpty())
{
String lineTransf = lineRead.replace("\n", "").replace("\r", "").replace(" ", "").replace("\"", "").trim();
println("LineTransf: " + lineTransf);
rotZ += 0.01*(Float.parseFloat(lineTransf));
println("Zrotation: " + rotZ); //Never gets here, throws and error before...
}
else
rotZ += 0;
}
catch(Exception e)
{
println("Exception: " + e);
}
这给了我一个错误:
NumberFormatException: invalid float value: "1.1400002"
在我的代码中,您可以看到我检查null、empty等,所以这不是问题所在。我已经试过了:
NumberFormat nf = NumberFormat.getInstance(Locale.US);
rotZ += 0.01*(nf.parse(lineTransf).floatValue());
得到了同样的结果。。。在stackoverflow中有一个类似的问题:
如果我尝试代码,还有一件奇怪的事情:
for(int i = 0; i < lineTransf.length(); i++)
println(lineTransf.substring(i,1));
更奇怪的是,当我对控制台中出现的数字“1.1400002”执行ctrl-c、ctrl-v时,它只在堆栈溢出上粘贴“1”。
我知道这个数字是对的,但在某些地方,转换是不正确的。我想这是因为字符串作为字节发送,作为字符串读取,但是我如何解决这个问题呢?提前谢谢 没什么奇怪的。这是
子字符串
的预期行为。它抛出一个IndexOutOfBoundsException
,如果startIndex
为负,则endIndex
大于字符串长度,或者如果startIndex
大于endIndex
(这是您的情况)。在我看来,您似乎想在索引处打印字符。试一试
for(int i = 0; i < lineTransf.length(); i++)
println(lineTransf.charAt(i));
for(int i=0;i
我找到了一个解决办法,但我真的,真的想得到一个解释(如果可能的话),因为这太难看了。。。我将代码更改为:
//BlueTooth
String lineRead = "";
try
{
lineRead = new String(sampleSPPServer.readFromDevice());
if(lineRead != null && !lineRead.isEmpty())
{
String lineTransf = lineRead.replace("\n", "").replace("\r", "").replace(" ", "").replace("\"", "").trim();
println("LineTransf: " + lineTransf + " " + lineTransf.length());
String lastTry = "";
for(int i = 0; i < lineTransf.length(); i++)
{
if(lineTransf.charAt(i) != ' ' && lineTransf.charAt(i) != '\u0000')
{
println(lineTransf.charAt(i));
lastTry += lineTransf.charAt(i);
}
}
println("LastTry: " + lastTry);
rotZ += 0.01*(Float.parseFloat(lastTry));
println("Zrotation: " + rotZ);
}
else
rotZ += 0;
//System.out.println("Line Read:" + lineRead);
}
catch(Exception e)
{
println("Exception: " + e);
}
如果他们通过了这个测试,我会单独“组装”最后的字符串。似乎蓝牙正在整个字符串的每个字符之间发送一个空字符。我不明白为什么会发生这种情况,它实际上在读取传入字符串时消耗了一些时间。如果有人有其他想法,我真的很想得到另一个答案…对不起,你是对的,我做了更改,它打印:lineTransf:1.8399,然后是1。8 3 9 9,但仍然给出长度19和异常:java.lang.NumberFormatException:用于输入字符串:无需担心。哪个部分不工作?“1.8399”和“1.1400002”都是有效的parsable,这就是我不理解的。行println(“LineTransf:+LineTransf”);打印这些数字,但rotZ+=0.01*(Float.parseFloat(lineTransf));无论我做什么,都会给我数字格式的感觉。我明白了。但是那19个角色也很奇怪,不是吗?可以打印
println(“LineTransf:+LineTransf+“size”+LineTransf.length())代码>?它精确地将其打印到控制台:LineTransf:9.959991尺寸15对于其他数字,它会打印数字和更大的尺寸(如上所示)
for(int i = 0; i < lineTransf.length(); i++)
println(lineTransf.charAt(i));
//BlueTooth
String lineRead = "";
try
{
lineRead = new String(sampleSPPServer.readFromDevice());
if(lineRead != null && !lineRead.isEmpty())
{
String lineTransf = lineRead.replace("\n", "").replace("\r", "").replace(" ", "").replace("\"", "").trim();
println("LineTransf: " + lineTransf + " " + lineTransf.length());
String lastTry = "";
for(int i = 0; i < lineTransf.length(); i++)
{
if(lineTransf.charAt(i) != ' ' && lineTransf.charAt(i) != '\u0000')
{
println(lineTransf.charAt(i));
lastTry += lineTransf.charAt(i);
}
}
println("LastTry: " + lastTry);
rotZ += 0.01*(Float.parseFloat(lastTry));
println("Zrotation: " + rotZ);
}
else
rotZ += 0;
//System.out.println("Line Read:" + lineRead);
}
catch(Exception e)
{
println("Exception: " + e);
}
if(lineTransf.charAt(i) != ' ' && lineTransf.charAt(i) != '\u0000')