我正在尝试格式化double,以便它只在小数分隔符后面打印2位数。我的所有变量都是双倍的,而奇怪的是它格式化using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ExtraPuttyDLL_Test
{
class Program
{
[DllImport("C:\\Users\\xroeseners\\Desktop\\ExtraPuTTY-0-29\\ExtraPuTTY.dll", EntryPoint = "Connexion")]
static extern int OpenConnection( string TargetName,
ref UInt32 ConnectionId,
string Login,
string Password,
byte ShowTerminal,
Int32 Protocol,
UInt32 PortNumber,
Int32 Report,
CallbackRcvData Callback,
UInt32 SpecSettings);
[DllImport("C:\\Users\\xroeseners\\Desktop\\ExtraPuTTY-0-29\\ExtraPuTTY.dll", EntryPoint = "SendRcvData")]
static extern int SendData( UInt32 ConnectionId,
string Data,
string Title,
string Comments,
Int32 TimeCapture,
char[] Buf,
Int32 MaxSizeData,
UInt32 settings);
// int SendRcvData(unsigned long ConnectionId,char *Command,char *Title,char *Comments,long TimeCapture,char **DataRcv,long MaxSizeofData,unsigned long settings);
// Settings Bit fields of settings (2^0 : CRLF (0 send,1 not send),2^1 : Virtual key codes (0 no virtual key codes in command,1 yes)...reserved)
// See FAQ page for a description of all virtual keys codes.
[DllImport("C:\\Users\\xroeseners\\Desktop\\ExtraPuTTY-0-29\\ExtraPuTTY.dll", EntryPoint = "CloseConnexion")]
static extern int CloseSession(UInt32 ConnectionId);
public static UInt32 myConnectionId;
public delegate int CallbackRcvData(UInt32 ConnectionId, IntPtr Data, Int32 size, Int32 Status);
public static string myString;
static void Main(string[] args)
{
myConnectionId = new UInt32();
int size, status;
char[] data = null;
CallbackRcvData Callback = new CallbackRcvData(RcvData);
//CallbackRcvData = new CallbackRcvData(myConnectionId,
OpenConnection("192.168.8.98",
ref myConnectionId,
"admin", // user
"admin", // password
0, // no display of putty terminal
1, // SSH Protocol
22, // Port
0, // Generate Report: 0 = nein
Callback,
0); // bin_000 -> dont wait login prompt, dynamically starting putty log, ssh v1 otherwise ssh v2
SendData(myConnectionId,
"uname -r",
"",
"",
5000,
data,
20000,
0);
CloseSession(myConnectionId);
}
public static int RcvData(UInt32 ConnectionId, IntPtr Data, Int32 size, Int32 Status)
{
if ((size > 0) && (Status == 0) && (Data != null))
{
myString = Marshal.PtrToStringAnsi(Data) ;
}
return 0;
}
}
}
就好并且不会出错,但是如果我尝试格式化aflossingen[i]
和interesten[i]
就像它只是一样给出了这个错误:
uitstaandeLening[i]
我的代码中也没有String类型变量或任何内容。我只是看不出有什么问题。
这是我的所有代码
Exception in thread "main" java.util.IllegalFormatConversionException: f != java.lang.String
at java.util.Formatter$FormatSpecifier.failConversion(Unknown Source)
at java.util.Formatter$FormatSpecifier.printFloat(Unknown Source)
at java.util.Formatter$FormatSpecifier.print(Unknown Source)
at java.util.Formatter.format(Unknown Source)
at java.io.PrintStream.format(Unknown Source)
at java.io.PrintStream.printf(Unknown Source)
答案 0 :(得分:0)
这是有效的,希望这会有所帮助:
import java.text.DecimalFormat;
public class TestDouble{
private static DecimalFormat df2 = new DecimalFormat(".##");
public static void main(String[] args) {
double input = 32.123456;
System.out.println("double : " + input);
System.out.println("double : " + df2.format(input));
}
}
答案 1 :(得分:0)
我找到了答案。
String.format需要Object,而不是double .. 所以你需要一个新的Doutble(双值)"
double d=1.234;
System.out.println( String.format("%.2f", new Double(d)));
答案 2 :(得分:0)
System.out.printf("\nJaar " + i + "\t" + uitstaandeLening[i] + "\t\t" + "%.2f" , interesten[i] + "\t\t" + "%.2f",
aflossingen[i]);
让我们仔细看看:
这是您告诉printf
格式化的字符串:"\nJaar " + i + "\t" + uitstaandeLening[i] + "\t\t" + "%.2f"
请注意uitstaandeLening
完全未格式化,它将被自动装箱并使用默认格式。
这是您的第一个参数:interesten[i] + "\t\t" + "%.2f"
这是非法的,因为您尝试将printf格式化为带有“f”格式化程序的字符串。与字符串串联使整个对象成为字符串。
因此,例如""+someIntegerVar
在评估后的类型为String。这就是interesten
也将被自动装箱和默认格式化的原因。
最后,第二个参数在模板中没有格式化程序(只有最顶层的字符串将被评估为格式化程序,而不是递归的参数)。
正确的行是:
System.out.printf("\nJaar %d\t %.2f \t\t %.2f \t\t %.2f" , i, uitstaandeLening[i], interesten[i], aflossingen[i]);
模板字符串中的所有格式化程序,然后只是数字参数。当然,你也可以使用字符串或日期参数。
此外,我建议使用BigDecimal。 Double会引入舍入错误,这在使用钱时可能很重要。
此外,您应该避免使用“+”连接字符串。例如,"\t\t" + "%.2f"
不是最理想的。这只是一个微调,但通常是一个很好的经验法则。
Oracle还有一个关于数字格式的教程:https://docs.oracle.com/javase/tutorial/java/data/numberformat.html