More plurals: decimal values

15 Sep 2010 | Comments

In my previous post, I showed you how to set string plurals. If you noticed, the methods to get the plurals strings only accept ints. What if (like me) you want to display a decimal value? I am getting my raw value from a progress bar with a range of 1-10, with 0.1 increments.

First, to display decimal values, I set my plurals string to display a float value.

<item quantity="other">Progress is at %.1f units.</item>

And then I devised a way to set the quantity based on the value of the progress bar (ProgressBar.getProgress() returns an int).

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

    // get quantity for plurals string
    int quantity = setQuantity(progress);

    // convert the actual progress to float
    float floatProgress = convertProgress(progress);

    // get the actual string and replace formatting with the float value
    String currentProgress = getResources()
         .getQuantityString(R.plurals.seekBarProgress, // get the plurals
         quantity, // set the quantity
         floatProgress); // format arguments

    // set text to display
    TextView displayProgress = (TextView)findViewById(R.id.prog_text);
    displayProgress.setText(currentProgress);

}

/**
* Use this method to see if we will use the singular or plural string.
*
* @param progress
* @return the value to set in getQuantityString()
*/
private int setQuantity(int progress){
   int quantity;

   if (((progress%10) == 0) && ((progress/10) == 1)){
       quantity = 1;
   } else {
       quantity = 2;
   }

   return quantity;
}

/**
* Use this value to get the *actual* value to display.
*
* @param progress actual progress value from 0 to 100
* @return the float value from 0.0 to 10.0
*/
private Float convertProgress(int progress){
   return ((Float.valueOf(String.valueOf(progress)))/(float)10);
}

So you see, it’s quite long-winded. Here are some screen shots of the results:

Different values for the unit value