Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 使用String.format(%.2f,67.876)自已定義語言(俄語、西班牙語)會把小數點變為逗號

android 使用String.format(%.2f,67.876)自已定義語言(俄語、西班牙語)會把小數點變為逗號

編輯:關於Android編程

市場人員反映公司的app使用系統設置俄語、西班牙語,double數據會把小數點變為逗號。調試一下,是自定義的語言時候(例如,俄語、西班牙語)轉換String.format("%.2f",67.876)。會出現的。

1、android 系統,設置系統語言的步驟

Android【設置】-【語言和輸入法】-【語言】列表中找到相應語言所對應的列表項

 

2、問題分析

java.util.Locale類

在這個Locale類裡面,有些語言是沒有,例如俄語、西班牙語等。那麼這時候android開發時候需要這些語言,怎麼辦。只好後面自已新建,自定義。

 

    /**
     * Locale constant for en_CA.
     */
    public static final Locale CANADA = new Locale(true, "en", "CA");

    /**
     * Locale constant for fr_CA.
     */
    public static final Locale CANADA_FRENCH = new Locale(true, "fr", "CA");

    /**
     * Locale constant for zh_CN.
     */
    public static final Locale CHINA = new Locale(true, "zh", "CN");

    /**
     * Locale constant for zh.
     */
    public static final Locale CHINESE = new Locale(true, "zh", "");

    /**
     * Locale constant for en.
     */
    public static final Locale ENGLISH = new Locale(true, "en", "");

Locale類裡面,私有方法新建語言的。可是不提供外部調用。

 

 

/**
     * There's a circular dependency between toLowerCase/toUpperCase and
     * Locale.US. Work around this by avoiding these methods when constructing
     * the built-in locales.
     *
     * @param unused required for this constructor to have a unique signature
     */
    private Locale(boolean unused, String lowerCaseLanguageCode, String upperCaseCountryCode) {
        this.languageCode = lowerCaseLanguageCode;
        this.countryCode = upperCaseCountryCode;
        this.variantCode = "";
    }

源碼中的這個方法是共外部新建語言的。
構造一個新的{ @code地區}使用指定的語言,國家,和變體編碼。

 

 

    /**
     * Constructs a new {@code Locale} using the specified language, country,
     * and variant codes.
     */
    public Locale(String language, String country, String variant) {
        if (language == null || country == null || variant == null) {
            throw new NullPointerException();
        }
        if (language.isEmpty() && country.isEmpty()) {
            languageCode = "";
            countryCode = "";
            variantCode = variant;
            return;
        }

        languageCode = language.toLowerCase(Locale.US);
        // Map new language codes to the obsolete language
        // codes so the correct resource bundles will be used.
        if (languageCode.equals("he")) {
            languageCode = "iw";
        } else if (languageCode.equals("id")) {
            languageCode = "in";
        } else if (languageCode.equals("yi")) {
            languageCode = "ji";
        }

        countryCode = country.toUpperCase(Locale.US);

        // Work around for be compatible with RI
        variantCode = variant;
    }

    @Override public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError(e);
        }
    }

這是我在外面新建俄語、西班牙語。因為調用不了上面是有方法。只有這個方法。
這個方法的新建是為了匹配資源文件的翻譯的以及後面的系統的調用

 

 

private static final Locale Locale_Russia = new Locale("RUS", "ru", "");
	private static final Locale Locale_Spanish = new Locale("ES", "es", "");
	public static void setApplicationLauguageType(Context context, int type) {
		if (context == null) return;
		Resources resources = context.getResources();//獲得res資源對象
	    Configuration config = resources.getConfiguration();//獲得設置對象
	    DisplayMetrics dm = resources .getDisplayMetrics();//獲得屏幕參數:主要是分辨率,像素等。
	    
	    switch (type) {
		case 0:
			config.locale = Locale.getDefault();
			break;
		case 1:
			config.locale = Locale.SIMPLIFIED_CHINESE;
			break;
		case 2:
			config.locale = Locale.ENGLISH;
			break;
		case 3:
			config.locale = Locale_Russia;
			break;
		case 4:
			config.locale = Locale_Spanish;
			break;
		default:
			config.locale = Locale.getDefault();
			break;
		}
	    
	    resources.updateConfiguration(config, dm);
	}

/**
     * Returns a localized formatted string, using the supplied format and arguments,
     * using the user's default locale.
     *
     * 

If you're formatting a string other than for human * consumption, you should use the {@code format(Locale, String, Object...)} * overload and supply {@code Locale.US}. See * "Be wary of the default locale". * * @param format the format string (see {@link java.util.Formatter#format}) * @param args * the list of arguments passed to the formatter. If there are * more arguments than required by {@code format}, * additional arguments are ignored. * @return the formatted string. * @throws NullPointerException if {@code format == null} * @throws java.util.IllegalFormatException * if the format is invalid. * @since 1.5 */ public static String format(String format, Object... args) { return format(Locale.getDefault(), format, args); }

 

 

這上面是一般調用方法,String strResult = String.format("%0.2f",543.6356);
這句語句是double型543.6356保留小數點的兩位,並轉化成String類型。
調用這個方法時候,其實是默認調用format(Locale.getDefault(), format, args)。因為返回是調用了這個。多了一個參數就是Locale.getDefault()。這個參數使獲取系統設置的語言。並作為後面的轉換參數的。

 

   /**
     * Returns a formatted string, using the supplied format and arguments,
     * localized to the given locale.
     *
     * @param locale
     *            the locale to apply; {@code null} value means no localization.
     * @param format the format string (see {@link java.util.Formatter#format})
     * @param args
     *            the list of arguments passed to the formatter. If there are
     *            more arguments than required by {@code format},
     *            additional arguments are ignored.
     * @return the formatted string.
     * @throws NullPointerException if {@code format == null}
     * @throws java.util.IllegalFormatException
     *             if the format is invalid.
     * @since 1.5
     */
    public static String format(Locale locale, String format, Object... args) {
        if (format == null) {
            throw new NullPointerException("format == null");
        }
        int bufferSize = format.length() + (args == null ? 0 : args.length * 10);
        Formatter f = new Formatter(new StringBuilder(bufferSize), locale);
        return f.format(format, args).toString();
    }

那麼現在問題就來了。但我使用自定義的語言時候(例如,俄語、西班牙語)。使用下面語句轉換,小數點會變成逗號

 

 

double dValue = 360.672;
String strValue = String.format("%.2f",dValue);
結果360,672


如果我使用Locale類有定義,就不會出現這種情況。例如中文,英文肯定是正常的。

 

3、解決辦法


分析到這裡了,就說一下解決辦法。
只好調用這個方法String.format(Locale.ENGLISH,"%.2f",dValue),多了一個參數。自已傳進去轉換的語言是什麼。不再是默認系統語言設置的。因為對於數據,全世界都是通用,那麼默認使用英語來轉換都沒有問題。數據都是這樣轉換的。

 

 

double dValue = 360.672;
String strValue = String.format(Locale.ENGLISH,"%.2f",dValue);

那麼又產生一個問題,同時有轉換字符串。這個得注意一下。
String strResult = String.format("%s:%.3f\r\n", getString(R.string.IteInfoCoorType, 654.76);
這個就要分開轉換再接起來,不然都是英文,轉換不了其他的語言的。

 

 

這個設計上缺陷是否是android sdk 或者jdk的存在bug。我使用都是jdk1.7和sdk 4.2版本。
歡迎大家發現與測試。

 

String.format("%.2f",dValue);
String.format(Locale.ENGLISH,"%.2f",dValue);
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved