2

1つに2つの質問がありますが、問題を示す非常に短いテストケースがあります。

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の何が問題になっていますか?数字が画面外に印刷されるのはなぜですか?

ありがとうございました!アレックス

アップデート:

ロケールを使用することになりました。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"));
    }
}
4

1 に答える 1

5

format.applyLocalizedPattern("#00.0#");1 の場合: の代わりに使用して形式を指定できます。format.setGroupingUsed(false);

もう 1 つのオプションは、カスタム形式の記号を使用することです。

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

ローカライズされたパターンといくつかの例の詳細については、http: //download.oracle.com/javase/tutorial/i18n/format/decimalFormat.htmlおよびhttp://download.oracle.com/javase/tutorial/i18nを参照してください。 /format/decimalFormat.html#numberpattern

2 番目の質問ではg2d.drawString(str, x, y)、ベースラインを使用するときは、長方形を描くときのように左上の位置ではなく x,y になります。ベースラインは、基本的に a、b、c などの文字の下部です。カンマや g、j、y などの文字は、ベースラインの下まで伸びています。基本的に、テキストを表示したいy位置にテキストの高さを追加する必要があります。

于 2011-07-14T18:14:04.673 に答える