setParseIntegerOnly的意外行为(true)

时间:2009-09-29 14:41:54

标签: java

关于 java.text.NumberFormat 类的java文档中明确提到了以下内容: -

setParseIntegerOnly :仅影响解析,例如如果是,“3456.78” - >如果为false,则为3456(并且在索引6之后留下解析位置),“3456.78” - > 3456.78(并在索引8之后保留解析位置)这与格式无关。

以下是一个例子: -

import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

public class NFTest {
  public static void main(String args[]) throws Exception {
    NumberFormat numberFormat = NumberFormat.getInstance();

    //statement which is not going well
    numberFormat = NumberFormat.getNumberInstance(Locale.CHINESE);
    numberFormat.setParseIntegerOnly(true);


    String usersNumber = "1976.0826" ;

    try{
        Number num = numberFormat.parse(usersNumber) ;
        System.out.println(num);
    }
    catch(ParseException pe){
        System.out.println(pe);
    }
  }
}

o / p: -

1976

现在,这里又是一个稍微改变的相同例子: -

import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

public class NFTest {
  public static void main(String args[]) throws Exception {
    NumberFormat numberFormat = NumberFormat.getInstance();

    numberFormat.setParseIntegerOnly(true);
    //result is getting affected, if I change the
    //position of following statement
    numberFormat = NumberFormat.getNumberInstance(Locale.CHINESE);


    String usersNumber = "1976.0826" ;

    try{
        Number num = numberFormat.parse(usersNumber) ;
        System.out.println(num);
    }
    catch(ParseException pe){
        System.out.println(pe);
    }
  }
}

o / p: -

1976.0826

为什么结果因语句位置的变化而受到影响???

2 个答案:

答案 0 :(得分:3)

您将使用对完全不同的对象的引用替换numberFormat的值...因此setParseIntegerOnly调用无效。

此代码:

NumberFormat numberFormat = NumberFormat.getInstance();
numberFormat.setParseIntegerOnly(true);
//result is getting effected, if i change the
//position of following statement
numberFormat = NumberFormat.getNumberInstance(Locale.CHINESE);

是等效的(假设getInstance和setParseIntegerOnly没有其他副作用):

NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.CHINESE);

为了使它脱离解析的上下文,假设我们有这个简单的类:

public class Person
{
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

你的问题实际上是在区别:

Person person = new Person();
person = new Person();
person.setName("Will be seen");
System.out.println(person.getName());

Person person = new Person();
person.setName("Will be seen");
person = new Person();
System.out.println(person.getName());

答案 1 :(得分:1)

在第二个代码示例中,您有以下代码:

NumberFormat numberFormat = NumberFormat.getInstance();
numberFormat.setParseIntegerOnly(true);
numberFormat = NumberFormat.getNumberInstance(Locale.CHINESE);

执行以下步骤:

  • 声明名为NumberFormat
  • numberFormat变量
  • NumberFormat返回的NumberFormat.getInstance()实例分配给numberFormat
  • 将该parseIntegerOnly实例的NumberFormat属性更改为true
  • NumberFormat返回的NumberFormat.getNumberInstance(Locale.CHINESE);实例分配给numberFormat

因此,您可以在以后不使用的NumberFormat实例上有效地设置该属性。