输入一串随机数字,然后按千分位输出。

比如输入数字串为“123456789”,输出为123,456,789

#!/bin/bash
read -p "输入一串数字:" num
v=`echo $num| sed 's/[0-9]//g'`
if [ -n "$v" ]
then
    echo "请输入纯数字。"
    exit
fi
length=${#num} #表示num字符串的长度
len=0
sum=''
for i in $(seq 1 $length) #可写为`seq 1 $length`
do
    len=$[$len+1]
    if [[ $len == 3 ]]
    then
        sum=','${num:$[0-$i]:1}$sum 
        #这里$[0-$i]也可改为0-$i
         #这里可以看为3个部分,','为一个部分,${num:$[0-$i]:1}为一个部分,$sum为为一个部分
        len=0
    else
        sum=${num:$[0-$i]:1}$sum
    fi
done
if [[ -n $(echo $sum | grep '^,')  ]] 
#判断是否是以“,”开头的行,如果是以“,”开头,可能类似“,123”的形式,所以要打印下标从1开始的数组(下标默认是从0开始)。
then
     echo ${sum:1}
else
     echo $sum
fi

解析:

read -p 将输入变量赋值给变量num

-n string 如果 string长度非零,则为真 [ -n "$myvar" ]

${#num}获取(num)字符串的长度

sum=','${num:$[0-$i]:1}$sum   将这个拆开看就好理解了,sum=','(单独的,)${num:${0-$i}:1}(切片数组)$sum(变量$sum的值)

${num:$[0-$i]:1},直接通过 ${数组名[@或*]:起始位置:长度}     切片原先数组,$[0-$i]就是起始位置,如果数值是0或正数,就从左到右数,下标依次为0,1,2,3.....,如果数值是负数,就从右往左数,下标依次为......-4,-3-2,-1,最后的长度为,从下标起始位置从左往右开始数,长度是多少就数到第几个

例如:

[[email protected] ~]# a=(1 2 3 4 5 6 7 8)
[[email protected] ~]# echo ${a[@]:1:4}
2 3 4 5
[[email protected] ~]# a=(1 2 3 4 5 6 7 8)
[[email protected] ~]# echo ${a[@]:0-3:2}
6  7
#0-3的值为-3,这里不能直接写-3

^表示行的开始,所以grep '^,'表示打印以“,”开头的行

主要是for循环这一段。如果输入num的值为12345,那么for循环中的i需要从1遍历到5

当i=1时 当i=2时 当i=3时 当i=4时 当i=5时
则len=1(len=0+1) 则len=2(len=1+1) 则len=3(len=2+1) 则len=1(len=0+1) 则len=2(len=1+1)
if判断len不等于3,执行elif if判断len不等于3,执行elif if判断len=3,条件成立 if判断len不等于3,执行elif if判断len不等于3,执行elif
则sum=${num:0-1:1}$sum,结果为sum=5与空($sum的值),所以sum=5 则sum=${num:0-2:1}$sum,结果为sum=4与 5($sum的值),所以sum=45 则sum=‘,’${num:0-3:1}$sum,结果为sum=,与3与 45($sum的值),所以sum=,345 则sum=${num:0-4:1}$sum,结果为sum=2与,345($sum的值),所以sum=2,345 则sum=${num:0-5:1}$sum,结果为sum=1与2,345($sum的值),所以sum=12,345

原文地址:http://blog.51cto.com/12129628/2072651

时间: 2024-10-11 06:52:33

输入一串随机数字,然后按千分位输出。的相关文章

两种方法解决数字加千分位问题(没考虑负数和小数)

问题描述:数字加千分位:要求用户输入一个整数,编写一个方法,方法将将整数转换为一个从低位开始每三位一个逗号的“千分位”字符串表示形式. //正向解法 package ThirdTest;import java.util.Scanner;public class No2{ public static void main(String[] args) { Scanner sc=new Scanner(System.in); int num=sc.nextInt(); thousand(num); s

sql为数字添加千分位(也就是钱的格式)

感觉这个东西在项目中用得挺多的,之前在前台页面是用正则来处理,现在由于是数据查询,所以直接在查出数据的时候将其转为指定的千分位格式,省的前台再处理,不讲原理,因为我也看不懂,不过会用就行了,在网上找了下,现在自己记录下,方便自己查看. Sql获取数字的千分位,就是将一个数字以三位,用逗号隔开,sql代码如下: (1)不带小数点: select reverse(stuff(reverse(convert(varchar,convert(money,1234333000),1)),1,3,''))

表格内数字按千分位进行格式化

方法一: DisplayInputFormat.DisplayInputFormat(webBean, "DepositAmountTE", ON_SUBMIT_VALIDATER_ATTR); public static void DisplayInputFormat(OAWebBean webBean,String lv_findchild,oracle.cabo.ui.AttributeKey key) { //Added by Tommy on 2012-09-08 for R

数字的千分位格式化方法

方法一:数组(字串)循环法 1 function toThousands(num) { 2 var result = [ ], counter = 0; 3 num = (num || 0).toString().split(''); 4 for (var i = num.length - 1; i >= 0; i--) { 5 counter++; 6 result.unshift(num[i]); 7 if (!(counter % 3) && i != 0) { 8 resul

[js开源组件开发]数字或金额千分位格式化组件

数字或金额千分位格式化组件 这次距离上一个组件<[js开源组件开发]table表格组件>时隔了一个月,由于最近的项目比较坑,刚挖完坑,所以来总结性提出来几个组件弥补这次的空缺,首先是金额和数字的千分位和小数点控制的组件,它的作用主要是在输入框时限制输入的内容为数字.也可以用于普通标签的数字格式化,效果如下图: demo演示地址请点击 http://www.lovewebgames.com/jsmodule/format-number.html 源码github托管地址请点击https://gi

angular 输入框自动绑定输入长串数字出错

最近发现angular在使用input输入框的ng-model绑定scope变量的时候,发现,输入长串的数字将会出错.代码如下: <html> <head> <meta charset="UTF-8"> <title>test</title> <script type="text/javascript" src="../script/angular1.4.6.min.js">

input组件中数字转成千分位的策略

在Web前端开发中input组件若只限制数字输入,并且希望将这些数字按照千分位隔开的话,那么我们可以通过一个js方法来实现,如下所示: toThousandsFormat(number) { if (number) { return '' } if (num.toString().trim() == '') { return '' } if (isNaN(number)) { return '' } number = parseFloat(number.toString().replace(/[

PHP中数字转为百分位,千分位,万分位。。。

今天做项目中,需要将文章点击量显示在页面中,需求中给的是多少多少万,虽然不是什么难事,但做程序员这么久了,需要考虑的不再是简单的实现,而且有效率和快捷, 虽然PHP自带的函数有number_format()可以做到实现千分位,但我要的是万分位, 通过查找,发现了可以用以下这个方法: $num = 86231; # 将数字转为万分位 echo $num>10000?sprintf("%.1f", $num/10000):$num; 类似的通过这个方法,可以稍微修改下,就可以实现百分

C 输入一串数字,去掉其中含7的和能被7整除的数

C 输入一串数字,去掉其中含7的和能被7整除的数,每个数小于10000,数字个数小于100 输入例子:1,7,56,77,87,2,45,42,97,9977 输出:1,2,45 注意:输入个数不确定,所以不能够用整形数组处理,不能以判断整形数组元素是否等于\n为结束,因为数组是整形的,\n是字符型的,是输入不进去的 所以要用字符串来处理,先把用逗号相隔的所有整数取出来,然后再对这些数进行判断输出 #include<stdio.h> #include<string.h> void