2011-07-14 9 views
2

两个问题,但我有一个很短的测试案例证明我的问题:使用的DecimalFormat(力点)和束带()(Y似乎是错的)在一个

import java.awt.*; 
import java.awt.image.*; 
import java.io.*; 
import java.text.*; 
import java.util.*; 
import javax.imageio.*; 

public class Numbers { 

    public static void main(String[] args) throws IOException { 
     double[] numbers = { 10000.12, 20000.23, 3000.45 }; 
     DecimalFormat format = new DecimalFormat("0.00"); 
     format.setGroupingUsed(false); 
     BufferedImage image = new BufferedImage(400, 150, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2d = image.createGraphics(); 
     g2d.setColor(Color.BLACK); 
     g2d.setBackground(Color.YELLOW); 
     g2d.clearRect(0, 0, image.getWidth(), image.getHeight()); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setFont(new Font(Font.SANS_SERIF,Font.BOLD, 24)); 
     FontMetrics metrics = g2d.getFontMetrics(); 

     for (int i = 0; i < numbers.length; i++) { 
      String str = format.format(numbers[i]); 
      System.out.println(i + ": " + str); 

      int w = metrics.stringWidth(str); 
      int h = metrics.getHeight(); 
      int x = 100 * i; 
      g2d.drawString(str, x - w/2, 0); 
     } 

     g2d.dispose(); 
     ImageIO.write(image, "PNG", new File("Numbers.png")); 
    } 
} 

当我使用它,我得到:

C:\Temp>javac -version 
javac 1.6.0_24 

C:\Temp>javac Numbers.java 

C:\Temp>java Numbers 
0: 10000,12 
1: 20000,23 
2: 3000,45 

该图像制作:

Numbers.png

我的问题:

  1. 如何强制DecimalFormat使用点而不是逗号,而不切换语言环境?
  2. w似乎是正确的,但0作为高度有什么问题 - 为什么数字打印在屏幕外?

谢谢!亚历克斯

UPDATE:

我已经结束了使用语言环境。 str.replace(“。”,“,”)评论也很酷。

import java.awt.*; 
import java.awt.image.*; 
import java.io.*; 
import java.text.*; 
import java.util.*; 
import javax.imageio.*; 

public class Numbers { 

    public static void main(String[] args) throws IOException { 
     double[] numbers = { 10000.12, 20000.23, 3000.45 }; 
     BufferedImage image = new BufferedImage(400, 150, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2d = image.createGraphics(); 
     g2d.setColor(Color.WHITE); 
     g2d.setBackground(Color.GRAY); 
     g2d.clearRect(0, 0, image.getWidth(), image.getHeight()); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setFont(new Font(Font.SANS_SERIF,Font.BOLD, 24)); 
     FontMetrics metrics = g2d.getFontMetrics(); 
     NumberFormat format = NumberFormat.getInstance(Locale.US); 
     format.setGroupingUsed(false); 
     if (format instanceof DecimalFormat) { 
      ((DecimalFormat) format).applyPattern("0.00"); 
     } 

     for (int i = 0; i < numbers.length; i++) { 
      String str = format.format(numbers[i]); 
      System.out.println(i + ": " + str); 

      int w = metrics.stringWidth(str); 
      int h = metrics.getHeight(); 
      int x = 100 * i; 
      g2d.drawString(str, x - w/2, h); 
     } 

     g2d.dispose(); 
     ImageIO.write(image, "PNG", new File("Numbers.png")); 
    } 
} 
+0

str = str.replace(“。”,“,”); – mKorbel

+0

你没有使用'h'。相反,你正在为你的字符串的高度硬编码一个'0'...... – mre

+0

是的 - 真的,我还没有使用h。我想知道为什么不是0,0文本的左上角? –

回答

5

为1:您可以指定使用format.applyLocalizedPattern("#00.0#");代替format.setGroupingUsed(false);

另一种选择的格式是使用自定义的格式符号:

DecimalFormatSymbols decimalSymbol = new DecimalFormatSymbols(Locale.getDefault()); 
decimalSymbol.setDecimalSeparator('.'); 
format.setGroupingUsed(false); 

更多本地化模式的信息和一些例子可在这里找到: http://download.oracle.com/javase/tutorial/i18n/format/decimalFormat.htmlhttp://download.oracle.com/javase/tutorial/i18n/format/decimalFormat.html#numberpattern

For your第二个问题,当您使用g2d.drawString(str, x, y)时,基线位于x,y不是绘制矩形时的左上角位置。基线基本上是字母a,b,c的底部。逗号和字母如g,j,y延伸到基线以下。您基本上需要将文本的高度添加到要显示文本的y位置。

+0

不幸的是,format.applyLocalizedPattern(“#00.0#”)给了我例外:格式错误的模式“#00.0#” –

+0

怪异的......这对我很有用。您可以查看以下链接以获取更多信息和示例: http://download.oracle.com/javase/tutorial/i18n/format/decimalFormat.html http://download.oracle.com/javase/tutorial/ i18n/format/decimalFormat.html#numberpattern –

+0

Try format.applyLocalizedPattern(“###。##”);它可能会更好。 –

相关问题