草庐IT

javascript:缩短大数,强制保留小数位,并选择将 1000 表示为 .001 百万

coder 2024-07-21 原文

我正在努力完成三件事 -

我想缩短大数字并添加 K/M/B 后缀 我希望能够强制小数位数 我希望能够强制将数千表示为百万的小数

只需缩短,四舍五入到小数点后两位

  • 1200000 ---->>> 120万
  • 1248000 ---->>> 125万
  • 248000 ---->>> 248K

缩短,强制保留 2 位小数

  • 1200000 ---->>> 120万
  • 1248000 ---->>> 125万
  • 248000 ---->>> 248.00K

缩短,强制小数点后3位,强制几千到几百万

  • 1200000 ---->>> 1.200M
  • 1248000 ---->>> 1.248M
  • 248000 ---->>> 0.248M

我有一个 javascript 函数,我发现它可以做很多这样的事情,除了它不强制小数位数,而且它不允许我强制几千到几百万

function shortenNumber (num, decimalPlaces) {
var str,
    suffix = '';

decimalPlaces = decimalPlaces || 0;
num = +num;

var factor = Math.pow(10, decimalPlaces);


//99999 -> 99.9K

if (num < 1000) {
    str = num;
} else if (num < 1000000) {
    str = Math.floor(num / (1000 / factor)) / factor;
    suffix = 'K';
} else if (num < 1000000000) {
    str = Math.floor(num / (1000000 / factor)) / factor;
    suffix = 'M';
} else if (num < 1000000000000) {
    str = Math.floor(num / (1000000000 / factor)) / factor;
    suffix = 'B';
} else if (num < 1000000000000000) {
    str = Math.floor(num / (1000000000000 / factor)) / factor;
    suffix = 'T';
}
return str + suffix;
}

所以它完成了第一个要求,部分完成了第二个(它会四舍五入到小数点后两位,但如果小数点为 0 则将其丢弃),但不能将 K 表示为 M

我如何修改此函数来执行此操作(或将其替换为另一个执行此操作的函数)?

谢谢!

最佳答案

这应该可以满足您的要求:

function abbreviate(number, maxPlaces, forcePlaces, forceLetter) {
  number = Number(number)
  forceLetter = forceLetter || false
  if(forceLetter !== false) {
    return annotate(number, maxPlaces, forcePlaces, forceLetter)
  }
  var abbr
  if(number >= 1e12) {
    abbr = 'T'
  }
  else if(number >= 1e9) {
    abbr = 'B'
  }
  else if(number >= 1e6) {
    abbr = 'M'
  }
  else if(number >= 1e3) {
    abbr = 'K'
  }
  else {
    abbr = ''
  }
  return annotate(number, maxPlaces, forcePlaces, abbr)
}

function annotate(number, maxPlaces, forcePlaces, abbr) {
  // set places to false to not round
  var rounded = 0
  switch(abbr) {
    case 'T':
      rounded = number / 1e12
      break
    case 'B':
      rounded = number / 1e9
      break
    case 'M':
      rounded = number / 1e6
      break
    case 'K':
      rounded = number / 1e3
      break
    case '':
      rounded = number
      break
  }
  if(maxPlaces !== false) {
    var test = new RegExp('\\.\\d{' + (maxPlaces + 1) + ',}$')
    if(test.test(('' + rounded))) {
      rounded = rounded.toFixed(maxPlaces)
    }
  }
  if(forcePlaces !== false) {
    rounded = Number(rounded).toFixed(forcePlaces)
  }
  return rounded + abbr
}

abbreviate(1200000, 2, false, false)
abbreviate(1248000, 2, false, false)
abbreviate(248000, 2, false, false)

abbreviate(1200000, 2, 2, false)
abbreviate(1248000, 2, 2, false)
abbreviate(248000, 2, 2, false)

abbreviate(1200000, 3, 3, 'M')
abbreviate(1248000, 3, 3, 'M')
abbreviate(248000, 3, 3, 'M')

关于javascript:缩短大数,强制保留小数位,并选择将 1000 表示为 .001 百万,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18151877/

有关javascript:缩短大数,强制保留小数位,并选择将 1000 表示为 .001 百万的更多相关文章

  1. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  2. ruby - 强制浏览器下载文件而不是打开文件 - 2

    我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.

  3. ruby - 在 Mechanize 中使用 JavaScript 单击链接 - 2

    我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan

  4. ruby - 强制 Ruby 不以标准形式/科学记数法/指数记数法输出 float - 2

    我遇到了同样的问题here对于python,但对于ruby​​。我需要输出这样一个小数字:0.00001,而不是1e-5。有关我的特定问题的更多信息,我正在使用f.write("Mynumber:"+small_number.to_s+"\n")输出到一个文件对于我的问题,准确性不是什么大问题,所以只做一个if语句来检查是否small_number那么更通用的方法是什么? 最佳答案 f.printf"Mynumber:%.5f\n",small_number您可以将.5(小数点右侧5位数字)替换为您喜欢的任何特定格式大小,例如,%8

  5. ruby-on-rails - 如何在 Rails 脚手架生成器上强制使用单数表名? - 2

    我正在使用遗留数据库并需要创建一些CRUD。我如何使用scaffold生成器并告诉他表的确切名称以避免复数化过程?表格也是西类牙语。 最佳答案 您可以只使用ActiveRecord::Base.table_name=方法手动设置表名。因此,在您的模型中您可以:classOrderDetail 关于ruby-on-rails-如何在Rails脚手架生成器上强制使用单数表名?,我们在StackOverflow上找到一个类似的问题: https://stackove

  6. ruby-on-rails - 如何在 ruby​​ 中将小数转换为美元和美分的字符串值? - 2

    我正在我的应用程序中存储成本。成本未在数据库中格式化。例如:00.00存为0,1.00存为1,40.50存为40.5我需要从数据库中读取这些值并将它们转换为表示美元和美分的字符串。例如:0-->cost_dollars="00"&cost_cents="00",1-->cost_dollars="01"&cost_cents="00",40.5-->cost_dollars="40"&cost_cents="50".在ruby​​onrails中有没有一种简单的方法可以做到这一点?或者有人有执行此操作的代码吗?谢谢! 最佳答案 您可

  7. ruby - 强制使用特定的 gem 版本作为默认版本? - 2

    假设我安装了三个gem:package-0.4.0、package-0.5.0和package-0.5.0-jbfink(我构建了-jbfink一个,因为我对0.5做了非常小的改动.0的来源,并希望将其与官方版本区分开来)。是否有gem(或其他命令)将其设为默认值?现在我已经安装了所有三个,但我的shell正在从package-0.5.0中获取可执行文件,我宁愿它默认为0.5.0-jbfink。将0.5.0-jbfink命名为0.5.1解决了这个问题,但我不想这样做,因为我不想与正式发布的0.5.1出现冲突。 最佳答案 转到conf

  8. javascript - jQuery 的 jquery-1.10.2.min.map 正在触发 404(未找到) - 2

    我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文

  9. ruby - 无法将 BigDecimal 强制转换为 BigDecimal - 2

    这应该很简单,但它正在爆炸。有什么想法吗?d=BigDecimal.new("2.0")YAML::load({:a=>d}.to_yaml)TypeError:BigDecimalcan'tbecoercedintoBigDecimalfrom/Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/inspector.rb:86:in`inspect'from/Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/inspector.rb

  10. ruby - 如何强制 Rack :session + sinatra to read "rack.session" from params instead of cookies - 2

    我正在处理oauth1.0(twitter和flickr)。网站工作在80端口,oauth服务器工作在8080端口算法:向oauth服务器发送ajax请求以检查用户是否有有效的access_token如果用户没有access_token或access_token已过期,则打开授权窗口在oauth服务器的用户session中保存access_token发送分享数据到oauth服务器它使用sinatra+rack:session+rack::session::sequel+sqlite来存储session。它在每个响应中发送Set-Cookie:rack.session=id我正在使用2种

随机推荐