ورود

View Full Version : جدا کردن سه تایی عدد (برای فیلد مبلغ)



mam_65
یک شنبه 04 بهمن 1394, 10:54 صبح
درود بر همه دوستان

برای دوستانی که لازم دارن سه تا سه در فیلد مبلغ با کاما جداشون کنند این Function رو استفاده کنند.

با امید اینکه بدرد کسی بخوره.

private String addCommasToNumericString (String digits) {
String result = "";
int len = digits.length();
int nDigits = 0;


for (int i = len - 1; i >= 0; i--)
{
result = digits.charAt(i) + result;
nDigits++;
if (((nDigits % 3) == 0) && (i > 0))
{
result = "," + result;
}
}
return (result);
}

ahmad.mo74
یک شنبه 04 بهمن 1394, 20:11 عصر
سلام.

خب این متود شما چنتا اشکال داره.
مثلا برای این رشته ها :


-123
-123.45
1.000002000003E29
salam :|


خروجی زیر تولید میشه :


-,123
-,123,.45
1.,000,002,000,003,E29
sa,lam, :|


خیلی راحت میشه از کلاس های DecimalFormat و BigDecimal برای اینکار استفاده کرد که همه این حالت هارو پوشش میدن (کافی بود کمی توی گوگل سرچ کنید) :


import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormat;


/**
* @author ahmad
*/
public final class NumberFormatUtils {


private NumberFormatUtils() {
}


public static String formatThousandSeparator(Number number) {
BigDecimal bigDecimal = toBigDecimal(number);
return formatThousandSeparator(bigDecimal, getNumberOfDecimalPlaces(bigDecimal));
}


public static String formatThousandSeparator(String source) {
BigDecimal bigDecimal = new BigDecimal(source);
return formatThousandSeparator(bigDecimal, getNumberOfDecimalPlaces(bigDecimal));
}


public static String formatThousandSeparator(String source, int precision) {
return formatThousandSeparator(new BigDecimal(source), precision);
}


public static String formatThousandSeparator(Number number, int precision) {
BigDecimal bigDecimal = toBigDecimal(number);
return buildFormat(getNumberOfIntegerDigits(bigDecimal), precision).format(bigDecimal);
}


private static BigDecimal toBigDecimal(Number number) {
return number instanceof BigDecimal ? (BigDecimal) number : new BigDecimal(number.toString());
}


private static int getNumberOfIntegerDigits(BigDecimal bigDecimal) {
BigInteger bigInteger = bigDecimal.toBigInteger().abs();
double factor = Math.log(2) / Math.log(10);
int digitCount = (int) (factor * bigInteger.bitLength() + 1);
return BigInteger.TEN.pow(digitCount - 1).compareTo(bigInteger) > 0 ? digitCount - 1 : digitCount;
}


private static int getNumberOfDecimalPlaces(BigDecimal bigDecimal) {
String string = bigDecimal.stripTrailingZeros().toPlainString();
int index = string.indexOf(".");
return index < 0 ? 0 : string.length() - index - 1;
}


private static DecimalFormat buildFormat(int integerDigits, int fractionDigits) {
DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setMaximumIntegerDigits(integerDigit s);
decimalFormat.setMaximumFractionDigits(fractionDig its);
decimalFormat.setGroupingUsed(true);
return decimalFormat;
}


public static void main(String[] args) {
String source = "100000200000300000400000500000.2133826602513108796 24452745279";
BigDecimal bigDecimal = new BigDecimal(source);
System.out.println(formatThousandSeparator(bigDeci mal));
System.out.println(formatThousandSeparator(bigDeci mal, 15));
System.out.println(formatThousandSeparator(source) );
System.out.println(formatThousandSeparator(source, 15));
}


}


خروجی :


100,000,200,000,300,000,400,000,500,000.2133826602 51310879624452745279
100,000,200,000,300,000,400,000,500,000.2133826602 51311
100,000,200,000,300,000,400,000,500,000.2133826602 51310879624452745279
100,000,200,000,300,000,400,000,500,000.2133826602 51311

mam_65
سه شنبه 04 اسفند 1394, 06:16 صبح
دوست عزیز یکم دقت میکردی میفهمیدی که من نوشتم برای فیلد مبلغ نه هر ورودی string دیگه ای پس وقتی شما رشته که مبلغ باشه وارد کنی درست خروجی میگیری مثلا 15000 میشه 15,000

ahmad.mo74
دوشنبه 09 فروردین 1395, 08:25 صبح
دوست عزیز یکم دقت میکردی میفهمیدی که من نوشتم برای فیلد مبلغ نه هر ورودی string دیگه ای پس وقتی شما رشته که مبلغ باشه وارد کنی درست خروجی میگیری مثلا 15000 میشه 15,000

بسیار هم عالی.

یعنی اگر یه برنامه نویسی خیلی تصادفی (یا عمدی) ورودی غیر مبلغ بهش بده چه بلایی سرش میاد؟ خطایی تولید میشه؟

این یعنی وجود باگ توی نرم افزار. میدونم درک نمیکنید که الان چی دارم میگم ولی ان شا الله در آینده درک خواهید کرد.
شما پتانسیل اینو دارید که توی یه سازمان دولتی بزرگ مدیریت یه پروژه خیلی بزرگ تر رو بهتون بسپارند.

موفق باشید.

mam_65
شنبه 25 اردیبهشت 1395, 11:38 صبح
یعنی اگر یه برنامه نویسی خیلی تصادفی (یا عمدی) ورودی غیر مبلغ بهش بده چه بلایی سرش میاد؟ خطایی تولید میشه؟




آقای باهوش زمانی که شما validation داری که فقط عدد وارد بشه دیگه کاربر نمیتونه هر کارکتری رو وارد کنه.

در ضمن از ادراک زیادی مشکی برات پیش نیاد یه وقت؟؟؟؟ :قهقهه::قهقهه::قهقهه:

vahid-p
شنبه 25 اردیبهشت 1395, 20:39 عصر
برای برنامه ای که بخواد GUI داشته باشه مشکل پیش میاد (خصوصا با JavaFX) که کاملا این موضوع رو در تاپیک " جداسازی سه تایی اعداد ، خطای java.lang.IllegalArgumentException (http://barnamenevis.org/showthread.php?523138-%D8%AC%D8%AF%D8%A7%D8%B3%D8%A7%D8%B2%DB%8C-%D8%B3%D9%87-%D8%AA%D8%A7%DB%8C%DB%8C-%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF-%D8%8C-%D8%AE%D8%B7%D8%A7%DB%8C-java-lang-IllegalArgumentException)" بررسی کردیم و در نهایت به یک خروجی عالی رسیدیم.
البته تابع شما برای حالت text-based مثل کنسول خوبه و به راحتی میشه کاملترش کرد اما الانه محیط گرافیکی خیلی مهمه.

ahmad.mo74
چهارشنبه 29 اردیبهشت 1395, 09:41 صبح
آقای باهوش زمانی که شما validation داری که فقط عدد وارد بشه دیگه کاربر نمیتونه هر کارکتری رو وارد کنه.

در ضمن از ادراک زیادی مشکی برات پیش نیاد یه وقت؟؟؟؟ :قهقهه::قهقهه::قهقهه:


دوست عزیز :))

من که یک کلمه هم از سخنان شما رو متوجه نشدم!
در ضمن در شان یک مدیر آینده نیست اینطور صحبت کردن...