2012-01-04 4 views
1

Я хочу, чтобы фильтр работал через строку и удалял все ненужные .0 из двухместных. Я уже пробовал заменять, но случаи вроде 8.02 превращаются в 82.Java Удалить все случаи .0

У меня такое чувство, что это было сделано раньше, но я не могу найти никакой помощи.

Я ищу метод, который будет принимать в String, например: «[double] plus [double] равно [double]», где [double] - это двойной, который необходимо проверить для избыточное десятичное число.

Заранее благодарен!

+0

Вы хотите удалить нули только из дробной части? Либо ведущий, либо конечный, или любой? – Lion

+0

Просто следите, пожалуйста. – Confiqure

ответ

2

предположим, что у вас есть строка с именем s, которая содержит текст, как вы описали. просто выполните:

s = s.replaceAll("([0-9])\\.0+([^0-9]|$)", "$1$2"); 

и все готово.

ОК, поэтому я отредактировал это несколько раз. теперь это работает!

+0

Спасибо большое! – Confiqure

+0

приветствую :) – davogotland

+0

Это интересно. Он работал отлично раньше, но теперь он исправляет всю ошибку последним числом. Например: «10.0 + 1.0 = 11.0 "становится" 10 + 1 = 11.0 ".Какой способ исправить это? – Confiqure

0

Не могли бы вы отнять конечные нули, прежде чем создавать их в свою строку? Таким образом, вы можете использовать метод DecimalFormatter, ранее опубликованный и затем удаленный.

NumberFormat formatter = new DecimalFormat("0.##"); 
String str = formatter.format("8.0200"); 
System.out.println(str); 

Дайте им кредит для кода, если они вернутся.

+0

Это не работает для того, что мне нужно для – Confiqure

0

Следующая программа удалит все конечные нули из дробной части двойного значения. Если ваши требования несколько отличаются, вам может потребоваться немного изменить его.

final public class Main 
{ 
    public static void main(String...args) 
    { 
     System.out.println("Enter how many numbers you want to check:->"); 
     Scanner scan = new Scanner(System.in); 

     final double KEY_VALUE = 0.0; 
     final Double TOLERANCE = 0.000000000001d; 

     int n = scan.nextInt(); 
     double[] a = new double[n]; 
     for (int i = 0; i < n; i++) 
     { 
       a[i] = scan.nextDouble(); 
     } 

     List<Double> newList = new ArrayList<Double>(); 
     for (int k = 0; k < n; k++) 
     { 
      if (Math.abs(a[k] - KEY_VALUE) < TOLERANCE) 
      { 
        continue; 
      } 
      newList.add(a[k]); 
     } 

     System.out.println(newList); 
    } 
} 

Вы можете использовать специально DecimalFormat усечь заданное число знаков после запятой, если вам нужно, например следующим образом.

double x=10.4555600500000; 
DecimalFormat df=new DecimalFormat("#.##"); 
System.out.println(df.format(x)); 

Вернуться 10.46.

0

Другие сообщения предполагают, что вы работаете с короткой строкой, содержащей только десятичную. Предполагая, что вы работаете с большими строками текста, вы можете использовать классы Pattern/Сличитель (я на работе, поэтому размещение в спешке Проверьте наличие ошибок.)

Используйте это регулярное выражение для замены:

/* >1 digits followed by a decimal and >1 zeros. Note capture group on first set of digits. This will only match decimals with trailing 0s, and not 8.0002 */ 
(\d+)\.0+ 

Заменить

/* First capture group */ 
$1 

Я не уверен правил регулярных выражений для Java, так что используйте это в качестве концепции, чтобы получить то, что вы хотите.

Смежные вопросы