【问题标题】:How to change value of a string?如何更改字符串的值?
【发布时间】:2017-05-09 07:13:30
【问题描述】:

字符串stored 中包含“1.0”。每次按下按钮时,我都想将其值增加0.5。但相反,我的输出变成了“1.00.5”。我该如何解决这个问题?

 String stored = userspeed.getText().toString();
 String speedplus = stored + 0.5;
 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
 SharedPreferences.Editor editor = preferences.edit();
 editor.putString("user_speed", speedplus.toString());
 editor.apply();

更新

public class ProgramActivity extends AppCompatActivity {
    EditText userspeed;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_program);
        userspeed = (EditText) findViewById(R.id.userspeed);

        //load values
        SharedPreferences preferences = PreferenceManager
                .getDefaultSharedPreferences(getBaseContext());
        String stored = preferences.getString("user_speed", "1.0");//default
        userspeed.setText(stored, TextView.BufferType.EDITABLE);

    }

    public void adduserspeed(View view) {
        String stored = userspeed.getText().toString();
        double storedValue = Double.parseDouble(stored);
        String speedplus = String.valueOf(storedValue +0.5f);
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString("user_speed", speedplus);
        editor.apply();
    }
}

【问题讨论】:

  • 它不是int。它是String,所以它会附加。使用int
  • 解析存储(即 1.0 作为浮点数并添加 0.5f)然后将其再次转换为字符串
  • 是的,你可以像 Double.parseDouble(stored) + 0.5d 一样使用 double,请看下面我的回答
  • @user12345 只是想知道,为什么要在其中添加“f”?

标签: android string


【解决方案1】:

首先,您需要将您的字符串值转换为浮点值,然后执行加法操作,最后将结果转换为字符串,以便您可以在共享首选项中存储为字符串。

    final String stored = userspeed.getText().toString();
    final float storedValue = Float.parseFloat(stored);
    final String speedplus = String.valueOf(storedValue + 0.5f);
    final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    final SharedPreferences.Editor editor = preferences.edit();
    editor.putString("user_speed", speedplus);
    editor.apply();

如果您想使用双精度值,只需将第一行替换为如下:

final String stored = "1.0";
final double storedValue = Double.parseDouble(stored);
final String speedplus = String.valueOf(storedValue + 0.5d);

更新 您的问题是,在 adduserspeed(View view) 方法中,您没有从首选项中检索存储的值,而是从 EditText 中检索,并且您没有更新该 EditText 值,因此每次执行 adduserspeed(View view) 方法时,您正在存储的值在首选项上是 1.0 + 0.5,因为在您重新打开应用程序之前,您的 EditText 值是 1.0。当您重新打开您的应用程序时,您的 EditText 值为 1.5,依此类推...

我已经改进了你的代码,现在运行良好,无论如何,不​​要只是复制我的代码,试着理解它,这样你就可以学习了。

public class MainActivity extends AppCompatActivity {
private EditText userSpeed;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    this.userSpeed = (EditText) findViewById(R.id.userspeed);
    setUserSpeedText();

}

public void adduserspeed(View view) {
    final String stored = getUserSpeedValue();
    final double storedValue = Double.parseDouble(stored);
    final String speedPlus = String.valueOf(storedValue + 0.5f);
    setUserSpeedValue(speedPlus);
    setUserSpeedText();
}

private String getUserSpeedValue() {
    final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    return preferences.getString("user_speed", "1.0");
}

private void setUserSpeedValue(final String newSpeedValue) {
    final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    final SharedPreferences.Editor editor = preferences.edit();
    editor.putString("user_speed", newSpeedValue);
    editor.apply();
}

private void setUserSpeedText() {
    if (null != this.userSpeed) {
        this.userSpeed.setText(getUserSpeedValue());
    }
}
}

【讨论】:

  • @user7984644 是的,你可以
  • @user7984644 这样您就可以告诉您要添加的值是浮点数而不是双精度数
  • @user7984644 final修饰符表示变量值不再被修改
  • @user7984644 你在哪里调用该代码?在 onClick 方法中?如果是这样,您不需要删除 final 修饰符。相反,如果您在 onCreate 方法中调用该代码,很明显,只有在您的活动创建时才会执行
  • @user7984644 发布您的活动完整代码,以便我查看发生了什么
【解决方案2】:

你也可以使用 double like:

 String speedplus = (Double.parseDouble(stored)+0.5).toString();

【讨论】:

    【解决方案3】:

    尝试将存储的 1.0 解析为 Double 然后添加 0.5d

    String speedplus = String.valueOf((Double.parseDouble(stored) + 0.5d));
    

    最终代码

    String stored = userspeed.getText().toString();
    String speedplus = String.valueOf((Double.parseDouble(stored) + 0.5d));
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString("user_speed", speedplus.toString());
    editor.apply();
    

    【讨论】:

      【解决方案4】:
          String stored = userspeed.getText().toString();
          float speedplus = Float.parseFloat(stored) + 0.5;
          SharedPreferences preferences = PreferenceManager
                  .getDefaultSharedPreferences(this);
          SharedPreferences.Editor editor = preferences.edit();
          editor.putFloat("user_speed", speedplus);
          editor.apply();
      

      将字符串值解析为int,然后进行数学运算。否则会发生字符串连接。

      【讨论】:

      • 这会在您将 int 分配给 String speedplus 时出错
      • 复制粘贴错误。我用浮点数修改了答案。谢谢你:)
      • 但 OP 想要 String 中的最终答案。
      • 你可以使用String.valueOf()转换成字符串
      【解决方案5】:

      最快的破解方法是:

      String speedplus = String.valueOf(Float.parseFloat(stored) + 0.5F);
      

      但是,您的下一个问题无疑是“为什么我的结果是1.499999999?”,即answered here in detail

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-25
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        • 2013-05-22
        相关资源
        最近更新 更多