এডিট টেক্সটে সংখ্যা দশমিক ইনপুট টাইপ সহ দশমিক বিভাজক কমা (',')


133

inputType numberDecimalমধ্যে EditTextডট ব্যবহার '।' দশমিক বিভাজক হিসাবে ইউরোপের পরিবর্তে কমা ',' ব্যবহার করা সাধারণ। যদিও আমার লোকেল জার্মান হিসাবে সেট করা আছে তবে দশমিক বিভাজক এখনও '।'

দশমিক বিভাজক হিসাবে কমা পাওয়ার কোনও উপায় আছে কি?



1
: এই বাগ পরিশেষে অ্যান্ড্রয়েড হে মধ্যে সংশোধন করা হয়েছে issuetracker.google.com/issues/36907764
Lovis

তারা বলে যে এটি স্থির আছে তবে আমি এটি স্থির করতে পারি না? পারবে তুমি?
সেবাস্তিয়ান

5
আমি নিশ্চিত করতে পারি যে এটি স্থির নয়, অন্ততপক্ষে আমার নেক্সাস 4 চলমান অ্যান্ড্রয়েড 8.1 (ওরফে লাইনেজওএস 15.1) এ। সেটিংস-> ভাষা ফরাসি (ফ্রান্স) এ সেট করা আছে, অ্যান্ড্রয়েডের সাথে একটি সম্পাদনা পাঠ্য: ইনপুট টাইপ = "নাম্বার ডেসিমাল" ',' (কমা) বিভাজক সরবরাহ করে কিন্তু এখনও কমা গ্রহণ করতে অস্বীকার করে। দেওয়া '।' (দশমিক পয়েন্ট) গৃহীত হয়। এই বাগটি রিপোর্ট হওয়ার পরে 9 বছর পেরিয়ে গেছে। এটা কি একরকম রেকর্ড? পঙ্গু.
পিট

উত্তর:


105

একটি workaround (গুগল এই ত্রুটি সংশোধন না করা পর্যন্ত) এবং এর EditTextসাথে ব্যবহার করা ।android:inputType="numberDecimal"android:digits="0123456789.,"

তারপরে নিম্নলিখিত পাঠ্যপরিবর্তনের সাথে সম্পাদনা পাঠ্যতে একটি পাঠ্য-পরিবর্তিত লিস্টনার যুক্ত করুন:

public void afterTextChanged(Editable s) {
    double doubleValue = 0;
    if (s != null) {
        try {
            doubleValue = Double.parseDouble(s.toString().replace(',', '.'));
        } catch (NumberFormatException e) {
            //Error
        }
    }
    //Do something with doubleValue
}

1
আপনার কীবোর্ডে কমা (,) দেখানোর জন্য জুম্বি আপনার ডিভাইসে ভাষা সেটের উপর নির্ভর করে। যদি আপনার ইনপুটটিতে টাইপ নম্বর থাকে দশমিক এবং আপনার ভাষাটি ইংরেজী (মার্কিন যুক্তরাষ্ট্র) থাকে তবে এটি নেক্সাস ডিভাইসগুলিতে প্রদর্শিত হবে (রেফারেন্স)। এটি সম্ভব যে নেক্সাস ডিভাইসগুলি
এটির

11
এটি কাজ করে তবে সচেতন হন যে এটি "24,22.55" এর মতো কোনও পাঠ্যকে প্রবেশ করতে দেয়। এটি ঠিক করতে আপনাকে অতিরিক্ত কিছু বৈধতা যুক্ত করতে হবে!
ডিমসুজ

8
এই কি এখনও যেতে হবে?
উইল মেন্টজেল

আরও ভাল, চর লোকালাইজডস্পেরেটর ব্যবহার করুন = ডেসিমালফর্ম্যাটসিম্বলস.জেটআইনস্ট্যান্স ()। GetDecimalSeparator (); লোকালাইজডফ্লোআটস্ট্রিং = লোকালাইজডফ্লাটস্ট্রিং.রেপ্লেস ('।', লোকালাইজডসেপেটর);
সাউথার্টন

4
দেখে মনে হচ্ছে এটি কেবল একটির জন্য অন্য বাগের ব্যবসায় করছে is উপরোক্ত প্রয়োগ হিসাবে, এটি পরিবর্তে ব্যবহারযোগ্য লোকেলগুলির জন্য কাজ করবে। বিপরীতে ব্যয় করে যা বিশ্বব্যাপী প্রচলিত। @ সাউদারনের টুইটগুলি এতে সহায়তা করে, তবে আপনার ব্যবহারকারীরা যখন এটিকে আঘাত করেন তখন অবাক হতে পারেন। এবং একটি আছে, ইনপুট প্রদর্শিত হবে।
নিক

30

এখানে প্রদত্ত 'অঙ্ক' সমাধানগুলিতে একটি বৈচিত্র:

char separator = DecimalFormatSymbols.getInstance().getDecimalSeparator();
input.setKeyListener(DigitsKeyListener.getInstance("0123456789" + separator));

অ্যাকাউন্টে লোকাল বিভাজক গ্রহণ করা।


এটি মূল প্রশ্নের সবচেয়ে পরিষ্কার উত্তর। ধন্যবাদ
পিটার.বার্তোস

এটি অনক্রিয়েট () এ রাখুন, এই উপায় যাবেন, আইএমএইচও।
টেকনাইকুইস্ট

6
আমি এটি পছন্দ করি তবে যত্নবান হোন ... এমন কীবোর্ড রয়েছে যা ব্যবহারকারীর লোকাল সম্পর্কে চিন্তা করে না, তাই ব্যবহারকারীদের ,কীবোর্ডে কী নেই । উদাহরণ: স্যামসং কীবোর্ড (কিটকাট)।
ব্রাইস গাবিন

2
এটি সদৃশ দশমিক বিভাজককে অনুমতি দেবে। এটি পরিচালনা করতে নীচের উত্তরটি দেখুন: stackoverflow.com/a/45384821/6138589
এসড্রাস লোপেজ

19

সম্পাদনা পাঠের জন্য কোড মুদ্রার মাস্ক অনুসরণ করুন (3 123,125.155)

এক্সএমএল লেআউট

  <EditText
    android:inputType="numberDecimal"
    android:layout_height="wrap_content"
    android:layout_width="200dp"
    android:digits="0123456789.,$" />

কোড

EditText testFilter=...
testFilter.addTextChangedListener( new TextWatcher() {
        boolean isEdiging;
        @Override public void onTextChanged(CharSequence s, int start, int before, int count) { }
        @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

        @Override public void afterTextChanged(Editable s) {
            if(isEdiging) return;
            isEdiging = true;

            String str = s.toString().replaceAll( "[^\\d]", "" );
            double s1 = Double.parseDouble(str);

            NumberFormat nf2 = NumberFormat.getInstance(Locale.ENGLISH);
            ((DecimalFormat)nf2).applyPattern("$ ###,###.###");
            s.replace(0, s.length(), nf2.format(s1));

            isEdiging = false;
        }
    });

16

এটি অ্যান্ড্রয়েড এসডিকে একটি পরিচিত বাগ । আপনার নিজস্ব সফট কীবোর্ড তৈরি করাই একমাত্র কাজ। আপনি এখানে প্রয়োগের একটি উদাহরণ খুঁজে পেতে পারেন ।


15
চার বছর পরে কি কোনও খবর আছে?
আন্তোনিও সেস্তো

এটি Xamarin.forms এও অভিজ্ঞতা হচ্ছে। সংস্কৃতিটি হ'ল {সে-এসভি} এবং নামপ্যাড বট দেখায় "," (দশমিক বিভাজক) এবং "।" (হাজার গ্রুপ বিভাজক) তবে ","
টিপানোর

আমি নিশ্চিত করতে পারি যে বাগটি এখনও রয়েছে।
লেন্সফ্লেয়ার

অ্যান্ড্রয়েড ও বিকাশকারী পূর্বরূপে স্থির করা হয়েছে
R00We

6

আপনি যদি প্রোগ্রামটিমে এডিটেক্সট ইনস্ট্যান্ট করে দিচ্ছেন তবে মার্টিনস উত্তরটি কাজ করবে না। আমি এগিয়ে গেলাম এবং অন্তর্ভুক্ত সংশোধিতDigitsKeyListenerদশমিক বিভাজক হিসাবে কমা এবং সময় উভয়র জন্য মঞ্জুরি দেওয়ার জন্য এপিআই 14 থেকে শ্রেণিকে ।

এটি ব্যবহার করতে, ডায়াল setKeyListener()করুন EditText, যেমন

// Don't allow for signed input (minus), but allow for decimal points
editText.setKeyListener( new MyDigitsKeyListener( false, true ) );

যাইহোক, আপনি এখনও TextChangedListenerপিরিয়ড সহ কমা প্রতিস্থাপন যেখানে মার্টিন এর কৌশল ব্যবহার করতে হবে

import android.text.InputType;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.NumberKeyListener;
import android.view.KeyEvent;

class MyDigitsKeyListener extends NumberKeyListener {

    /**
     * The characters that are used.
     *
     * @see KeyEvent#getMatch
     * @see #getAcceptedChars
     */
    private static final char[][] CHARACTERS = new char[][] {
        new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' },
        new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-' },
        new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',' },
        new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '.', ',' },
    };

    private char[] mAccepted;
    private boolean mSign;
    private boolean mDecimal;

    private static final int SIGN = 1;
    private static final int DECIMAL = 2;

    private static MyDigitsKeyListener[] sInstance = new MyDigitsKeyListener[4];

    @Override
    protected char[] getAcceptedChars() {
        return mAccepted;
    }

    /**
     * Allocates a DigitsKeyListener that accepts the digits 0 through 9.
     */
    public MyDigitsKeyListener() {
        this(false, false);
    }

    /**
     * Allocates a DigitsKeyListener that accepts the digits 0 through 9,
     * plus the minus sign (only at the beginning) and/or decimal point
     * (only one per field) if specified.
     */
    public MyDigitsKeyListener(boolean sign, boolean decimal) {
        mSign = sign;
        mDecimal = decimal;

        int kind = (sign ? SIGN : 0) | (decimal ? DECIMAL : 0);
        mAccepted = CHARACTERS[kind];
    }

    /**
     * Returns a DigitsKeyListener that accepts the digits 0 through 9.
     */
    public static MyDigitsKeyListener getInstance() {
        return getInstance(false, false);
    }

    /**
     * Returns a DigitsKeyListener that accepts the digits 0 through 9,
     * plus the minus sign (only at the beginning) and/or decimal point
     * (only one per field) if specified.
     */
    public static MyDigitsKeyListener getInstance(boolean sign, boolean decimal) {
        int kind = (sign ? SIGN : 0) | (decimal ? DECIMAL : 0);

        if (sInstance[kind] != null)
            return sInstance[kind];

        sInstance[kind] = new MyDigitsKeyListener(sign, decimal);
        return sInstance[kind];
    }

    /**
     * Returns a DigitsKeyListener that accepts only the characters
     * that appear in the specified String.  Note that not all characters
     * may be available on every keyboard.
     */
    public static MyDigitsKeyListener getInstance(String accepted) {
        // TODO: do we need a cache of these to avoid allocating?

        MyDigitsKeyListener dim = new MyDigitsKeyListener();

        dim.mAccepted = new char[accepted.length()];
        accepted.getChars(0, accepted.length(), dim.mAccepted, 0);

        return dim;
    }

    public int getInputType() {
        int contentType = InputType.TYPE_CLASS_NUMBER;
        if (mSign) {
            contentType |= InputType.TYPE_NUMBER_FLAG_SIGNED;
        }
        if (mDecimal) {
            contentType |= InputType.TYPE_NUMBER_FLAG_DECIMAL;
        }
        return contentType;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end,
                               Spanned dest, int dstart, int dend) {
        CharSequence out = super.filter(source, start, end, dest, dstart, dend);

        if (mSign == false && mDecimal == false) {
            return out;
        }

        if (out != null) {
            source = out;
            start = 0;
            end = out.length();
        }

        int sign = -1;
        int decimal = -1;
        int dlen = dest.length();

        /*
         * Find out if the existing text has '-' or '.' characters.
         */

        for (int i = 0; i < dstart; i++) {
            char c = dest.charAt(i);

            if (c == '-') {
                sign = i;
            } else if (c == '.' || c == ',') {
                decimal = i;
            }
        }
        for (int i = dend; i < dlen; i++) {
            char c = dest.charAt(i);

            if (c == '-') {
                return "";    // Nothing can be inserted in front of a '-'.
            } else if (c == '.' ||  c == ',') {
                decimal = i;
            }
        }

        /*
         * If it does, we must strip them out from the source.
         * In addition, '-' must be the very first character,
         * and nothing can be inserted before an existing '-'.
         * Go in reverse order so the offsets are stable.
         */

        SpannableStringBuilder stripped = null;

        for (int i = end - 1; i >= start; i--) {
            char c = source.charAt(i);
            boolean strip = false;

            if (c == '-') {
                if (i != start || dstart != 0) {
                    strip = true;
                } else if (sign >= 0) {
                    strip = true;
                } else {
                    sign = i;
                }
            } else if (c == '.' || c == ',') {
                if (decimal >= 0) {
                    strip = true;
                } else {
                    decimal = i;
                }
            }

            if (strip) {
                if (end == start + 1) {
                    return "";  // Only one character, and it was stripped.
                }

                if (stripped == null) {
                    stripped = new SpannableStringBuilder(source, start, end);
                }

                stripped.delete(i - start, i + 1 - start);
            }
        }

        if (stripped != null) {
            return stripped;
        } else if (out != null) {
            return out;
        } else {
            return null;
        }
    }
}

দস্তাবেজ থেকে: কীলিস্টেনার কেবলমাত্র সেই ক্ষেত্রে ব্যবহার করা উচিত যেখানে কোনও অ্যাপ্লিকেশনটির নিজস্ব অন-স্ক্রিন কীপ্যাড রয়েছে এবং এটির সাথে মিলে যাওয়ার জন্য শক্ত কীবোর্ড ইভেন্টগুলি প্রক্রিয়া করতে চায়। বিকাশকারী.অ্যান্ড্রয়েড
রেফারেন্স /

6

আপনি বিভিন্ন লোকেলের জন্য নিম্নলিখিত ব্যবহার করতে পারেন

private void localeDecimalInput(final EditText editText){

    DecimalFormat decFormat = (DecimalFormat) DecimalFormat.getInstance(Locale.getDefault());
    DecimalFormatSymbols symbols=decFormat.getDecimalFormatSymbols();
    final String defaultSeperator=Character.toString(symbols.getDecimalSeparator());

    editText.addTextChangedListener(new TextWatcher() {

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
            if(editable.toString().contains(defaultSeperator))
                editText.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
            else
                editText.setKeyListener(DigitsKeyListener.getInstance("0123456789" + defaultSeperator));
        }
    });
}

এটি আমার পক্ষে সেরা সমাধান, তবে কিছু ফোন যেমন ই স্যামসাং, যা কীবোর্ডে "," কোমা দেখাচ্ছে না তা নিয়ে সমস্যা রয়েছে। তাই আমি কোমা এবং বিন্দু উভয়কেই অনুমতি দেওয়ার জন্য এটি পরিবর্তন করেছি, তবে তারপরে লোকাল অনুসারে প্রতিস্থাপন করা হয়েছে
রিকার্ডো ক্যাসাট্টা

5

বৈধ ইনপুট হিসাবে কমা অন্তর্ভুক্ত করতে আপনি নীচের কাজটি ব্যবহার করতে পারেন: -

এক্সএমএলের মাধ্যমে:

<EditText
    android:inputType="number"
    android:digits="0123456789.," />

প্রোগ্রামেটিক্যালি:

EditText input = new EditText(THE_CONTEXT);
input.setKeyListener(DigitsKeyListener.getInstance("0123456789.,"));

এইভাবে অ্যান্ড্রয়েড সিস্টেম নম্বরগুলির কীবোর্ড দেখায় এবং কমাতে ইনপুট দেয়। এই প্রশ্নের উত্তর আশা করি :)


এই সমাধানটির সাহায্যে আপনি "," এ ট্যাপ করুন তবে পাঠ্য শোতে সম্পাদনা করুন ""
ম্যারা জিমনেজ

2

মনো (ড্রড) সমাধানের জন্য:

decimal decimalValue = decimal.Parse(input.Text.Replace(",", ".") , CultureInfo.InvariantCulture);

1

আপনি নিম্নলিখিত করতে পারেন:

DecimalFormatSymbols d = DecimalFormatSymbols.getInstance(Locale.getDefault());
input.setFilters(new InputFilter[] { new DecimalDigitsInputFilter(5, 2) });
input.setKeyListener(DigitsKeyListener.getInstance("0123456789" + d.getDecimalSeparator()));

এবং তারপরে আপনি একটি ইনপুট ফিল্টার ব্যবহার করতে পারেন:

    public class DecimalDigitsInputFilter implements InputFilter {

Pattern mPattern;

public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero) {
    DecimalFormatSymbols d = new DecimalFormatSymbols(Locale.getDefault());
    String s = "\\" + d.getDecimalSeparator();
    mPattern = Pattern.compile("[0-9]{0," + (digitsBeforeZero - 1) + "}+((" + s + "[0-9]{0," + (digitsAfterZero - 1) + "})?)||(" + s + ")?");
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

    Matcher matcher = mPattern.matcher(dest);
    if (!matcher.matches())
        return "";
    return null;
}

}


হাজার এবং শতাধিকের মধ্যে জায়গা থাকতে পারে, এই প্যাটার্নটি ফর্ম্যাট করা ইনপুটটি প্রত্যাখ্যান করবে
এরিক ঝাও

1

এই সমস্যাটির জন্য আইএমএইচওর সর্বোত্তম পন্থা হ'ল কেবল ইনপুটফিল্টার ব্যবহার করা। একটি দুর্দান্ত টুকরা এখানে ডেসিমাল ডিজিটস ইনপুটফিল্টার । তারপরে আপনি ঠিক করতে পারেন:

editText.setInputType(TYPE_NUMBER_FLAG_DECIMAL | TYPE_NUMBER_FLAG_SIGNED | TYPE_CLASS_NUMBER)
editText.setKeyListener(DigitsKeyListener.getInstance("0123456789,.-"))
editText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(5,2)});

এটি একটি মোহন মত কাজ করেছে, আপনাকে ধন্যবাদ! (উপরে অনেকগুলি ভুল সমাধানের পরে ... :() তবে আমার একটি প্রশ্ন আছে: আমি কীভাবে সেই কমাটি অর্জন করতে পারি (",") ডট নয় ("।") পর্দায় প্রদর্শিত হয়েছে কারণ হাঙ্গেরিতে আমরা দশমিক বিভাজক হিসাবে কমা ব্যবহার করেছি ।
অ্যাবিগাইল লা'ফায়

1
অ্যান্ড্রয়েড: অঙ্কগুলি = "0123456789," সেটিংস এডিট টেক্সটে যুক্ত করা যেতে পারে। অধিকন্তু, DecimalDigitsInputFilter মধ্যে নাল ফিরে পরিবর্তে, আপনি source.replace আসতে পারেন ( "," "।") উত্তর অনুযায়ী stackoverflow.com/a/40020731/1510222 সেখানে একটি প্রমিত কীবোর্ড লুকান ডট হওয়ার কোন উপায় নেই
আরকাদিউস সিলেলিস্কি

1

আপনার ইনপুট ব্যবহার স্থানীয়করণ করতে:

char sep = DecimalFormatSymbols.getInstance().getDecimalSeparator();

এবং তারপরে যুক্ত করুন:

textEdit.setKeyListener(DigitsKeyListener.getInstance("0123456789" + sep));

"," সাথে "প্রতিস্থাপন করতে ভুলবেন না" সুতরাং ফ্লোট বা ডাবল এটিকে ত্রুটি ছাড়াই পার্স করতে পারে।


1
এই সমাধানটি একাধিক কমাতে প্রবেশ করতে দেয়
লিও ড্রয়েডকোডার

1

এখানের অন্যান্য সমস্ত পোস্টের সেগুলিতে বড় বড় ছিদ্র ছিল তাই এখানে একটি সমাধান যা এখানে আসবে:

  • অঞ্চল ভিত্তিক কমা বা সময়সীমা প্রয়োগ করুন, আপনাকে বিপরীতটি টাইপ করতে দেবে না।
  • এডিটেক্সট যদি কিছু মান দিয়ে শুরু হয় তবে এটি সঠিক বিভাজকটিকে প্রয়োজনীয় হিসাবে প্রতিস্থাপন করে।

এক্সএমএলে:

<EditText
    ...
    android:inputType="numberDecimal" 
    ... />

শ্রেণি পরিবর্তনশীল:

private boolean isDecimalSeparatorComma = false;

অনক্রিয়েটে, বর্তমান লোকালে ব্যবহৃত বিভাজকটি সন্ধান করুন:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    NumberFormat nf = NumberFormat.getInstance();
    if (nf instanceof DecimalFormat) {
        DecimalFormatSymbols sym = ((DecimalFormat) nf).getDecimalFormatSymbols();
        char decSeparator = sym.getDecimalSeparator();
        isDecimalSeparatorComma = Character.toString(decSeparator).equals(",");
    }
}

এছাড়াও অনক্রিট, আপনি যদি কোনও বর্তমান মান লোড করে থাকেন তবে এটি আপডেট করতে এটি ব্যবহার করুন:

// Replace editText with commas or periods as needed for viewing
String editTextValue = getEditTextValue(); // load your current value
if (editTextValue.contains(".") && isDecimalSeparatorComma) {
    editTextValue = editTextValue.replaceAll("\\.",",");
} else if (editTextValue.contains(",") && !isDecimalSeparatorComma) {
    editTextValue = editTextValue.replaceAll(",",".");
}
setEditTextValue(editTextValue); // override your current value

এছাড়াও অনক্রিট, শ্রোতাদের যুক্ত করুন

editText.addTextChangedListener(editTextWatcher);

if (isDecimalSeparatorComma) {
    editText.setKeyListener(DigitsKeyListener.getInstance("0123456789,"));
} else {
    editText.setKeyListener(DigitsKeyListener.getInstance("0123456789."));
}

editTextWatcher

TextWatcher editTextWatcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) { }

    @Override
    public void afterTextChanged(Editable s) {
        String editTextValue = s.toString();

        // Count up the number of commas and periods
        Pattern pattern = Pattern.compile("[,.]");
        Matcher matcher = pattern.matcher(editTextValue);
        int count = 0;
        while (matcher.find()) {
            count++;
        }

        // Don't let it put more than one comma or period
        if (count > 1) {
            s.delete(s.length()-1, s.length());
        } else {
            // If there is a comma or period at the end the value hasn't changed so don't update
            if (!editTextValue.endsWith(",") && !editTextValue.endsWith(".")) {
                doSomething()
            }
        }
    }
};

doSomething () উদাহরণস্বরূপ, ডেটা ম্যানিপুলেশনের জন্য স্ট্যান্ডার্ড পিরিয়ডে রূপান্তর

private void doSomething() {
    try {
        String editTextStr = editText.getText().toString();
        if (isDecimalSeparatorComma) {
            editTextStr = editTextStr.replaceAll(",",".");
        }
        float editTextFloatValue = editTextStr.isEmpty() ?
                0.0f :
                Float.valueOf(editTextStr);

        ... use editTextFloatValue
    } catch (NumberFormatException e) {
        Log.e(TAG, "Error converting String to Double");
    }
}

0

অ্যান্ড্রয়েড একটি বিল্ট ইন নম্বর বিন্যাসক আছে।

EditTextদশমিক এবং কমাগুলিকে অনুমতি দেওয়ার জন্য আপনি এটিতে এটি যুক্ত করতে পারেন: android:inputType="numberDecimal" এবংandroid:digits="0123456789.,"

তারপরে আপনার কোডের কোথাও, হয় যখন ক্লিক ক্লিক করুন ব্যবহারকারী সংরক্ষণ করুন বা পাঠ্য প্রবেশের পরে (শ্রোতার ব্যবহার করুন)।

// Format the number to the appropriate double
try { 
    Number formatted = NumberFormat.getInstance().parse(editText.getText().toString());
    cost = formatted.doubleValue();
} catch (ParseException e) {
    System.out.println("Error parsing cost string " + editText.getText().toString());
    cost = 0.0;
}

0

আমি সম্পাদনা করার সময় কমাটি বিন্দুতে পরিবর্তন করার সিদ্ধান্ত নিয়েছি। এখানে আমার কৌশল এবং আপেক্ষিক সহজ কাজ আছে:

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            EditText editText = (EditText) v; 
            String text = editText.getText().toString();
            if (hasFocus) {
                editText.setText(text.replace(",", "."));
            } else {
                if (!text.isEmpty()) {
                    Double doubleValue = Double.valueOf(text.replace(",", "."));
                    editText.setText(someDecimalFormatter.format(doubleValue));
                }
            }
        }
    });

কিছু ডেসিমাল ফরমেটার কমা ব্যবহার করবে বা ডট লোকালের উপর নির্ভর করবে


0

আমি জানি না কেন আপনার উত্তরগুলি এত জটিল। এসডিকে কোনও বাগ থাকলে আপনার এটি অবশ্যই ওভাররাইড করে বা ঘুরে বেড়াতে হবে।

আমি এই সমস্যাটি সমাধান করার জন্য দ্বিতীয় উপায়টি বেছে নিয়েছি। আপনি যদি নিজের স্ট্রিংটিকে ফর্ম্যাট করেন Locale.ENGLISHএবং তারপরে এটি EditText(এমনকি খালি স্ট্রিং হিসাবে) রেখে দেন। উদাহরণ:

String.format(Locale.ENGLISH,"%.6f", yourFloatNumber);

সেই সমাধানটির পশ্চাদ্ধাবন করা আপনার ফলাফল দেখানো কীবোর্ডের সাথে সামঞ্জস্যপূর্ণ। তারপরে ভাসা এবং ডাবল সংখ্যা কমা পরিবর্তে ডট দিয়ে প্রোগ্রামিং ভাষা পদ্ধতিতে সাধারণভাবে কাজ করে।


0

আমার সমাধানটি হ'ল:

  • প্রধান ক্রিয়াকলাপে:

    char separator =DecimalFormatSymbols.getInstance().getDecimalSeparator(); textViewPitchDeadZone.setKeyListener(DigitsKeyListener.getInstance("0123456789" + separator));

  • এক্সএমএল ফাইলে: android:imeOptions="flagNoFullscreen" android:inputType="numberDecimal"

এবং আমি স্ট্রিং হিসাবে এডিটেক্সট এ ডাবল নিয়েছি।


0

আমি নিশ্চিত করতে পারি যে প্রস্তাবিত ফিক্সগুলি স্যামসাং আইএমই (কমপক্ষে এস 6 এবং এস 9 এ) এবং সম্ভবত এলজিতে কাজ করে না। তারা লোকাল নির্বিশেষে দশমিক বিভাজক হিসাবে একটি বিন্দু প্রদর্শন করে। গুগলের আইএমইতে স্যুইচ করা এটি ঠিক করে তবে বেশিরভাগ বিকাশকারীদের পক্ষে এটি খুব কমই বিকল্প।

এই কী-বোর্ডগুলির জন্য ওরিওতে এটি স্থির করা হয়নি কারণ এটি একটি স্থির যে স্যামসাং এবং / অথবা এলজি করতে হবে এবং তারপরে এমনকি তাদের প্রাচীন হ্যান্ডসেটগুলিতেও চাপ দিতে হবে।

আমি পরিবর্তে নম্বর-কীবোর্ড প্রকল্পটি কাঁটাচামচ করেছি এবং এমন একটি মোড যুক্ত করেছি যেখানে এটি কোনও আইএমই: কাঁটাচলার মতো আচরণ করে । বিশদ জন্য প্রকল্পের নমুনা দেখুন। এটি আমার পক্ষে বেশ ভালভাবে কাজ করেছে এবং ব্যাংকিং অ্যাপ্লিকেশনগুলিতে আপনি যে অনেকগুলি "পিন এন্ট্রি" নকল আইএমই দেখতে পান তার সাথে মিল রয়েছে।

নমুনা অ্যাপ্লিকেশন স্ক্রিনশট


0

এটা তোলে চেয়ে বেশি 8 বছর উত্তীর্ণ হন এবং অবাক হচ্ছি, এই সমস্যাটি এখনো সংশোধন করা হয় না হয় ...
আমি এই সহজ বিষয়টি যেহেতু সঙ্গে লড়াই দেয় @Martin সবচেয়ে সম্মত উত্তর নেই একাধিক বিভাজক টাইপ, অর্থাত্ ব্যবহারকারী "12 টাইপ করতে পারেন ,,, ,,, 12,1, 21,2, "
এছাড়াও, দ্বিতীয় উদ্বেগ হ'ল কিছু ডিভাইসে কমা সংখ্যাসূচক কীবোর্ডে প্রদর্শিত হয় না (বা কোনও ডট বোতামের একাধিক চাপ প্রয়োজন)

এখানে আমার কাজের সমাধান, যা উল্লিখিত সমস্যাগুলি সমাধান করে এবং ব্যবহারকারীকে টাইপ করতে দেয়। ' এবং ',' তবে এডিটেক্সটে তিনি একমাত্র দশমিক বিভাজক দেখতে পাবেন যা বর্তমান লোকেলের সাথে মিলে যায়:

editText.apply { addTextChangedListener(DoubleTextChangedListener(this)) }

এবং পাঠ্য প্রহরী:

  open class DoubleTextChangedListener(private val et: EditText) : TextWatcher {

    init {
        et.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL
        et.keyListener = DigitsKeyListener.getInstance("0123456789.,")
    }

    private val separator = DecimalFormatSymbols.getInstance().decimalSeparator

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        //empty
    }

    @CallSuper
    override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
        et.run {
            removeTextChangedListener(this@DoubleTextChangedListener)
            val formatted = toLocalizedDecimal(s.toString(), separator)
            setText(formatted)
            setSelection(formatted.length)
            addTextChangedListener(this@DoubleTextChangedListener)
        }
    }

    override fun afterTextChanged(s: Editable?) {
        // empty
    }

    /**
     * Formats input to a decimal. Leaves the only separator (or none), which matches [separator].
     * Examples:
     * 1. [s]="12.12", [separator]=',' -> result= "12,12"
     * 2. [s]="12.12", [separator]='.' -> result= "12.12"
     * 4. [s]="12,12", [separator]='.' -> result= "12.12"
     * 5. [s]="12,12,,..,,,,,34..,", [separator]=',' -> result= "12,1234"
     * 6. [s]="12.12,,..,,,,,34..,", [separator]='.' -> result= "12.1234"
     * 7. [s]="5" -> result= "5"
     */
    private fun toLocalizedDecimal(s: String, separator: Char): String {
        val cleared = s.replace(",", ".")
        val splitted = cleared.split('.').filter { it.isNotBlank() }
        return when (splitted.size) {
            0 -> s
            1 -> cleared.replace('.', separator).replaceAfter(separator, "")
            2 -> splitted.joinToString(separator.toString())
            else -> splitted[0]
                    .plus(separator)
                    .plus(splitted.subList(1, splitted.size - 1).joinToString(""))
        }
    }
}

0

সহজ সমাধান, একটি কাস্টম নিয়ন্ত্রণ করুন। (এটি জামারিন অ্যান্ড্রয়েডে তৈরি তবে জাভাতে সহজেই পোর্ট করা উচিত)

public class EditTextDecimalNumber:EditText
{
    readonly string _numberFormatDecimalSeparator;

    public EditTextDecimalNumber(Context context, IAttributeSet attrs) : base(context, attrs)
    {
        InputType = InputTypes.NumberFlagDecimal;
        TextChanged += EditTextDecimalNumber_TextChanged;
        _numberFormatDecimalSeparator = System.Threading.Thread.CurrentThread.CurrentUICulture.NumberFormat.NumberDecimalSeparator;

        KeyListener = DigitsKeyListener.GetInstance($"0123456789{_numberFormatDecimalSeparator}");
    }

    private void EditTextDecimalNumber_TextChanged(object sender, TextChangedEventArgs e)
    {
        int noOfOccurence = this.Text.Count(x => x.ToString() == _numberFormatDecimalSeparator);
        if (noOfOccurence >=2)
        {
            int lastIndexOf = this.Text.LastIndexOf(_numberFormatDecimalSeparator,StringComparison.CurrentCulture);
            if (lastIndexOf!=-1)
            {
                this.Text = this.Text.Substring(0, lastIndexOf);
                this.SetSelection(this.Text.Length);
            }

        }
    }
}


-1

আমি মনে করি যে এই সমাধানটি এখানে লিখিত অন্যদের চেয়ে কম জটিল:

<EditText
    android:inputType="numberDecimal"
    android:digits="0123456789," />

আপনি যখন '' টিপুন তখন এইভাবে। নরম কীবোর্ডে কিছুই ঘটে না; কেবল সংখ্যা এবং কমা অনুমোদিত।


4
আপনি যদি এটি করেন তবে আপনি সমস্ত লোকাল ব্যবহার করবেন যা 'ব্যবহার করে।' পরিবর্তে.
নিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.